zoukankan      html  css  js  c++  java
  • asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文件接口

    FormItem类

    public class FormItem
        {
            public string Name { get; set; }
            public ParamType ParamType { get; set; }
            public string Value { get; set; }
        }

    ParamType枚举

        public enum ParamType
        { 
            ///
            /// 文本类型
            ///
            Text,
            ///
            /// 文件路径,需要全路径(例:C:A.JPG)
            ///
            File
        }

    Funcs静态类

        public static class Funcs
        {
            public static string PostFormData(List list,string uri)
            {
                string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
                //请求 
                WebRequest req = WebRequest.Create(uri);
                req.Method = "POST";
                req.ContentType = "multipart/form-data; boundary=" + boundary;
                //组织表单数据 
                StringBuilder sb = new StringBuilder();
                foreach (FormItem item in list)
                {
                    switch (item.ParamType)
                    {
                        case ParamType.Text:
                            sb.Append("--" + boundary);
                            sb.Append("
    ");
                            sb.Append("Content-Disposition: form-data; name="" + item.Name + """);
                            sb.Append("
    
    ");
                            sb.Append(item.Value);
                            sb.Append("
    ");
                            break;
                        case ParamType.File:
                            sb.Append("--" + boundary);
                            sb.Append("
    ");
                            sb.Append("Content-Disposition: form-data; name="media"; filename=""+item.Value+""");
                            sb.Append("
    ");
                            sb.Append("Content-Type: application/octet-stream");
                            sb.Append("
    
    ");
                            break;
                    }
                }
                string head = sb.ToString();
                //post字节总长度
                long length = 0;
                byte[] form_data = Encoding.UTF8.GetBytes(head);
                //结尾 
                byte[] foot_data = Encoding.UTF8.GetBytes("
    --" + boundary + "--
    ");
                List fileList = list.Where(f => f.ParamType == ParamType.File).ToList();
                length = form_data.Length + foot_data.Length;
                foreach (FormItem fi in fileList)
                {
                    FileStream fileStream = new FileStream(fi.Value, FileMode.Open, FileAccess.Read);
                    length += fileStream.Length;
                    fileStream.Close();
                }
                req.ContentLength = length;           
    
                Stream requestStream = req.GetRequestStream();
                //发送表单参数 
                requestStream.Write(form_data, 0, form_data.Length);
                foreach (FormItem fd in fileList)
                {
                    FileStream fileStream = new FileStream(fd.Value, FileMode.Open, FileAccess.Read);
                    //文件内容 
                    byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
                    int bytesRead = 0;
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                        requestStream.Write(buffer, 0, bytesRead);
                    //结尾 
                    requestStream.Write(foot_data, 0, foot_data.Length);
                }
                requestStream.Close();
    
                //响应 
                WebResponse pos = req.GetResponse();
                StreamReader sr = new StreamReader(pos.GetResponseStream(), Encoding.UTF8);
                string html = sr.ReadToEnd().Trim();
                sr.Close();
                if (pos != null)
                {
                    pos.Close();
                    pos = null;
                }
                if (req != null)
                {
                    req = null;
                }
                return html;
            }
            ///
            /// 从URL地址下载文件到本地磁盘
            ///
            /// 本地磁盘地址
            /// URL网址
            ///
            public static string SaveFileFromUrl(string FileName, string Url)
            {
                WebResponse response = null;
                Stream stream = null;
                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                    response = request.GetResponse();
                    stream = response.GetResponseStream();
    
                    if (!response.ContentType.ToLower().StartsWith("text/"))
                    {
                        SaveBinaryFile(response, FileName);
                    }
                    else
                    {
                        StreamReader sr = new StreamReader(stream, System.Text.Encoding.UTF8);
                        return sr.ReadToEnd();
                    }
    
                }
                catch (Exception err)
                {
                    return err.ToString();
                }
                return "complete";
            }
            ///
            /// 将二进制文件保存到磁盘
            ///
            /// 将二进制文件保存到磁盘
            // 将二进制文件保存到磁盘
            private static bool SaveBinaryFile(WebResponse response, string FileName)
            {
                bool Value = true;
                byte[] buffer = new byte[1024];
    
                try
                {
                    if (File.Exists(FileName))
                        File.Delete(FileName);
                    Stream outStream = System.IO.File.Create(FileName);
                    Stream inStream = response.GetResponseStream();
    
                    int l;
                    do
                    {
                        l = inStream.Read(buffer, 0, buffer.Length);
                        if (l > 0)
                            outStream.Write(buffer, 0, l);
                    }
                    while (l > 0);
    
                    outStream.Close();
                    inStream.Close();
                }
                catch
                {
                    Value = false;
                }
                return Value;
            }
    }

    调用代码

    //新建一个form表单项,就是需要提交哪些字段和数据的列表
     List list = new List();
    //添加微信接口上的access_token参数,注意,access_token是有过期时间的,代码中的access_token肯定过期了,获取access_token的地址请点击我,需要有自己的服务号才会有的
     list.Add(new FormItem() { Name = "access_token", ParamType = ParamType.Text, Value = "MlfTORyg_dRTuiQThmKUxVVkK7q_SMEd0y9GwBmj6NJw3E0J2jVnC3RxgdO1Yjog2QD4DDxhdqEkZaklR7czq8sSbW4mnhM7n9-5lIIymVGkrBAv2nnnktUyYcuYTMs2SYtp-pn6IWEtTpsFVlUFZQ" });
    //添加FORM表单中这条数据的类型,目前只做了两种,一种是文本,一种是文件
     list.Add(new FormItem() { Name = "type", Value = "image", ParamType = ParamType.Text });
    //添加Form表单中文件的路径,路径必须是基于硬盘的绝对路径
     list.Add(new FormItem() { Name = "media", Value = @"d:1.jpg", ParamType = ParamType.File });
    //通过Funcs静态类中的PostFormData方法,将表单数据发送至http://file.api.weixin.qq.com/cgi-bin/media/upload腾讯上传下载文件接口
     string result = Funcs.PostFormData(list, "http://file.api.weixin.qq.com/cgi-bin/media/upload");
    //获取返回值,并取出的结果中的media_id,注意,有可能返回的是腾讯的错误代码,请自行判断
     System.Web.Script.Serialization.JavaScriptSerializer jss = new System.Web.Script.Serialization.JavaScriptSerializer();
     var mydata=jss.Deserialize(result);
    //通过Funcs静态类中的SaveFileFromUrl方法,将指定微信media_id的文件下载到本机
     var saveResult=Funcs.SaveFileFromUrl(@"d:lee.jpg", "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=MlfTORyg_dRTuiQThmKUxVVkK7q_SMEd0y9GwBmj6NJw3E0J2jVnC3RxgdO1Yjog2QD4DDxhdqEkZaklR7czq8sSbW4mnhM7n9-5lIIymVGkrBAv2nnnktUyYcuYTMs2SYtp-pn6IWEtTpsFVlUFZQ&media_id=" + mydata["media_id"].ToString());

    这样就完成了模拟CURL调用微信上传下载多媒体文件的接口

  • 相关阅读:
    Windows 2003下面Apache+SVN配置
    Oracle中年月日级联填充查询语句
    Tomcat创建一个windows服务
    Oracle10G常用维护语句汇总
    Oracle10g安装了11g的ODAC后,PL/SQL连接提示TNS:无法解析指定的连接标识符
    小谈EasyUI中的tree用法
    正则表达式用法
    执行存储过程返回游标集合转换成List
    面试过程中关于Oracle的查询
    一个可以匹配整数、浮点数的正则表达式
  • 原文地址:https://www.cnblogs.com/superfeeling/p/7921785.html
Copyright © 2011-2022 走看看