FormItem类

  1. public class FormItem
  2. {
  3. public string Name { get; set; }
  4. public ParamType ParamType { get; set; }
  5. public string Value { get; set; }
  6. }

ParamType枚举

  1. public enum ParamType
  2. {
  3. ///
  4. /// 文本类型
  5. ///
  6. Text,
  7. ///
  8. /// 文件路径,需要全路径(例:C:\A.JPG)
  9. ///
  10. File
  11. }

Funcs静态类

  1. public static class Funcs
  2. {
  3. public static string PostFormData(List list,string uri)
  4. {
  5. string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
  6. //请求
  7. WebRequest req = WebRequest.Create(uri);
  8. req.Method = "POST";
  9. req.ContentType = "multipart/form-data; boundary=" + boundary;
  10. //组织表单数据
  11. StringBuilder sb = new StringBuilder();
  12. foreach (FormItem item in list)
  13. {
  14. switch (item.ParamType)
  15. {
  16. case ParamType.Text:
  17. sb.Append("--" + boundary);
  18. sb.Append("\r\n");
  19. sb.Append("Content-Disposition: form-data; name="" + item.Name + """);
  20. sb.Append("\r\n\r\n");
  21. sb.Append(item.Value);
  22. sb.Append("\r\n");
  23. break;
  24. case ParamType.File:
  25. sb.Append("--" + boundary);
  26. sb.Append("\r\n");
  27. sb.Append("Content-Disposition: form-data; name="media"; filename=""+item.Value+""");
  28. sb.Append("\r\n");
  29. sb.Append("Content-Type: application/octet-stream");
  30. sb.Append("\r\n\r\n");
  31. break;
  32. }
  33. }
  34. string head = sb.ToString();
  35. //post字节总长度
  36. long length = ;
  37. byte[] form_data = Encoding.UTF8.GetBytes(head);
  38. //结尾
  39. byte[] foot_data = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
  40. List fileList = list.Where(f => f.ParamType == ParamType.File).ToList();
  41. length = form_data.Length + foot_data.Length;
  42. foreach (FormItem fi in fileList)
  43. {
  44. FileStream fileStream = new FileStream(fi.Value, FileMode.Open, FileAccess.Read);
  45. length += fileStream.Length;
  46. fileStream.Close();
  47. }
  48. req.ContentLength = length;
  49.  
  50. Stream requestStream = req.GetRequestStream();
  51. //发送表单参数
  52. requestStream.Write(form_data, , form_data.Length);
  53. foreach (FormItem fd in fileList)
  54. {
  55. FileStream fileStream = new FileStream(fd.Value, FileMode.Open, FileAccess.Read);
  56. //文件内容
  57. byte[] buffer = new Byte[checked((uint)Math.Min(, (int)fileStream.Length))];
  58. int bytesRead = ;
  59. while ((bytesRead = fileStream.Read(buffer, , buffer.Length)) != )
  60. requestStream.Write(buffer, , bytesRead);
  61. //结尾
  62. requestStream.Write(foot_data, , foot_data.Length);
  63. }
  64. requestStream.Close();
  65.  
  66. //响应
  67. WebResponse pos = req.GetResponse();
  68. StreamReader sr = new StreamReader(pos.GetResponseStream(), Encoding.UTF8);
  69. string html = sr.ReadToEnd().Trim();
  70. sr.Close();
  71. if (pos != null)
  72. {
  73. pos.Close();
  74. pos = null;
  75. }
  76. if (req != null)
  77. {
  78. req = null;
  79. }
  80. return html;
  81. }
  82. ///
  83. /// 从URL地址下载文件到本地磁盘
  84. ///
  85. /// 本地磁盘地址
  86. /// URL网址
  87. ///
  88. public static string SaveFileFromUrl(string FileName, string Url)
  89. {
  90. WebResponse response = null;
  91. Stream stream = null;
  92. try
  93. {
  94. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
  95. response = request.GetResponse();
  96. stream = response.GetResponseStream();
  97.  
  98. if (!response.ContentType.ToLower().StartsWith("text/"))
  99. {
  100. SaveBinaryFile(response, FileName);
  101. }
  102. else
  103. {
  104. StreamReader sr = new StreamReader(stream, System.Text.Encoding.UTF8);
  105. return sr.ReadToEnd();
  106. }
  107.  
  108. }
  109. catch (Exception err)
  110. {
  111. return err.ToString();
  112. }
  113. return "complete";
  114. }
  115. ///
  116. /// 将二进制文件保存到磁盘
  117. ///
  118. /// 将二进制文件保存到磁盘
  119. // 将二进制文件保存到磁盘
  120. private static bool SaveBinaryFile(WebResponse response, string FileName)
  121. {
  122. bool Value = true;
  123. byte[] buffer = new byte[];
  124.  
  125. try
  126. {
  127. if (File.Exists(FileName))
  128. File.Delete(FileName);
  129. Stream outStream = System.IO.File.Create(FileName);
  130. Stream inStream = response.GetResponseStream();
  131.  
  132. int l;
  133. do
  134. {
  135. l = inStream.Read(buffer, , buffer.Length);
  136. if (l > )
  137. outStream.Write(buffer, , l);
  138. }
  139. while (l > );
  140.  
  141. outStream.Close();
  142. inStream.Close();
  143. }
  144. catch
  145. {
  146. Value = false;
  147. }
  148. return Value;
  149. }
  150. }

调用代码

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

asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文件接口的更多相关文章

  1. asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文

    近公司项目上在开发微信服务号的接口,需要给用户回复图片或语音或视频,这个时候就需要用到 上传下载多媒体文件接口,微信在这方面推荐采用的是开源函数库curl实现的,CURL项目包括很多版本,我主要测试的 ...

  2. C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  3. NET实现微信公共平台上传下载多媒体文件(转)

    举个例子,有人对着我们的公共微信号拍个照片发送过来,然后我们处理这个照片,比如进行ocr识别字(随后就会降到这个例子),或者人脸识别,或者拍照取证等,这些功能都是相当有用的.那么我们现在就要分析一下这 ...

  4. 使用curl / wget命令上传下载FTP

    curl可以在shell下轻松上传下载ftp上的文件,相比ftp命令更具有优势,因为它能在单命令条件下,下载或者上传一个ftp文件,甚至可以删除文件. 下面看实例: 1.列出ftp服务器上的目录列表: ...

  5. ASP.NET MVC 微信公共平台开发之获取用户消息并处理

    ASP.NET MVC 微信公共平台开发 获取用户消息并处理 获取用户消息 用户发送的消息是在微信服务器发送的一个HTTP POST请求中包含的,获取用户发送的消息要从POST请求的数据流中获取 微信 ...

  6. ASP.NET MVC 微信公共平台开发之验证消息的真实性

    ASP.NET MVC 微信公共平台开发 验证消息的真实性 在MVC Controller所在项目中添加过滤器,在过滤器中重写 public override void OnActionExecuti ...

  7. ASP.NET MVC 微信公共平台开发之 微信接入

    ASP.NET MVC 接入微信公共平台 申请微信公共账号 既然要接入微信公共平台,微信公共号是必须的(当然如果只是测试的话也可以申请微信公共平台接口测试账号),来这里微信公共平台 申请微信公共号(注 ...

  8. PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制

    2013年10月06日最新整理. PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 微信公共平台消息主动推送接口一直是腾讯的私用接口,相信很多朋友都非常想要用到这个功能. 通过学习 ...

  9. 第三方网站不能调用微信公众平台里的图片了 显示"此图片来自微信公众号平台未经允许不可引用"

    下午ytkah在自己小博客搜索时看到有几篇文章图片显示不了,再访问一些网站时发现有些图片无法显示出来,显示"此图片来自微信公众号平台未经允许不可引用",如下图所示,这个应该是最近微 ...

随机推荐

  1. MHA 一主一从搭建

    安装基本环境介绍 一主一从     MHA manager & slave  node2 192.168.56.27 Master机器 node1 192.168.56.26 VIP   19 ...

  2. ubuntu安装完整版的vim

    apt-get remove vim-commonapt-get install vim

  3. Android学习笔记_19_广播接收者 BroadcastReceiver及其应用_窃听短信_拦截外拨电话

    一.广播接收者类型: 广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”. 普通广播是完全异步的,可以在同一时刻(逻辑上 ...

  4. Android学习笔记_6_保存文件到SDCard

    一.加入访问sdcard的权限 Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态 ...

  5. android imageview使用的时候 引用资源src和background的区别

    android imageview使用的时候 引用资源时src和background的区别 src更强调内容并且不行拉伸图片进行适配,而background更注重引用图片,会对图片进行拉伸

  6. linux系统命令与常识

    之前短期学过linux,用到时才发现已经忘得一干二净了. 现在对学过的和了解到的做一个总结: 先明确一些使用工具: winscp : WinSCP是一个Windows环境下使用SSH的开源图形化SFT ...

  7. ajax 全局拦载处理,可加密、过滤、筛选、sql防注入处理

    //此方法放在公用的js里面即可.如此:所有的ajax请求都会通过此 $.ajaxSetup({ contentType: "application/x-www-form-urlencode ...

  8. Linux修改时区以及同步时间

    Centos7为例:修改时区 timedatectl list-timezones |grep Shanghai #查找中国时区的完整名称 Asia/Shanghai timedatectl set- ...

  9. if switch for while

    ---恢复内容开始--- 一.if 说明:判断表达式,看结果执行语句体 public class IfDemo2 {             public static void main(Strin ...

  10. c++后台开发 准备材料

    后台开发知识点 面面俱到很难,一个领域钻研的很深也很难.我认识的大神里有把C++语言吃的非常透的,也有实验室就是搞分布式的,拿offer都非常轻松. 博客(C++后台/基础架构) http://www ...