近公司项目上在开发微信服务号的接口,需要给用户回复图片或语音或视频,这个时候就需要用到 上传下载多媒体文件接口,微信在这方面推荐采用的是开源函数库curl实现的,CURL项目包括很多版本,我主要测试的是windows 平台下的版本,是很好用的,下面附上说明及CURL下载地址
在asp.net中,可以调用cmd命令行,运行这个脚本,实现上传下载的功能,但我需要讲的重点不在此,做为一个在线运行的项目,允许网站目录下可以运行.exe的程序是非常不安全的,所以接下来的DEMO是采用asp.net(c#)的方式,调用微信的这个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("\r\n");

sb.Append("Content-Disposition: form-data; name="" + item.Name + """);

sb.Append("\r\n\r\n");

sb.Append(item.Value);

sb.Append("\r\n");

break;

case ParamType.File:

sb.Append("--" + boundary);

sb.Append("\r\n");

sb.Append("Content-Disposition: form-data; name="media"; filename=""+item.Value+""");

sb.Append("\r\n");

sb.Append("Content-Type: application/octet-stream");

sb.Append("\r\n\r\n");

break;

}

}

string head = sb.ToString();

//post字节总长度

long length = 0;

byte[] form_data = Encoding.UTF8.GetBytes(head);

//结尾

byte[] foot_data = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");

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_SMEd0y9GwBmj6NJw3E0J
2jVnC3RxgdO1Yjog2QD4DDxhdqEkZaklR7czq8sSbW4mnhM7n9-5lIIymVGkrBAv2nnnk
tUyYcuYTMs2SYtp-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调用微信上传下载多媒体文件的接口

不知道大家有没有其它更好或更方便的办法,欢迎与我讨论

如果有需要的朋友,调用过程中有问题,欢迎私信给我,我可以把DEMO发给他

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

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

    FormItem类 public class FormItem { public string Name { get; set; } public ParamType ParamType { get; ...

  2. C#-微信公众平台接口-上传临时素材

    最烦做微信公众平台的东西..文档说得不清不楚,又没示例代码,只能自己 慢慢搜索,弄了一晚上,基本弄出来了,把本地的图片上传到微信的临时素材那里,返回媒体ID,用于其他操作,代码如下 :(自己导入相应的 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. 微信公共平台注册 bug: 验证码不应该输入后,就立即检查其有效性

    本文链接: https://www.cnblogs.com/hchengmx/p/10793037.html 刚刚想注册个微信公众号,就发现了这个问题,在这里记录一下. 已经发到testhome了,链 ...

随机推荐

  1. 快速切题 sgu116. Index of super-prime bfs+树思想

    116. Index of super-prime time limit per test: 0.25 sec. memory limit per test: 4096 KB Let P1, P2, ...

  2. python随机数,随机选择……random

    import random from random import random, uniform, randint, randrange, choice, sample, shuffle list = ...

  3. Struts2内置校验器——完整实例代码

    一.校验器的配置风格 1.字段校验器: <field name="被校验的字段"> <field-validator type="校验器名"& ...

  4. 吐血推荐:罗马尼亚无版权VPS服务商HostSolutions评测-绝对真实

    要放心大胆的玩 VPS,要找性价比高.信用好,服务稳定,限制少的服务商是很不容易的.这里我先点几个黑名单:第一类 HiFormance.VirMach 低价流 VPS 服务商,以低从吸引消费者.俗话说 ...

  5. 浏览器是怎样工作的:渲染引擎,HTML解析

    渲染引擎 渲染引擎的职责是……渲染,也就是把请求的内容显示到浏览器屏幕上. 默认情况下渲染引擎可以显示HTML,XML文档以及图片. 通过插件(浏览器扩展)它可以显示其它类型文档.比如使用PDF vi ...

  6. 玩转X-CTR100 | STM32F4 l Malloc内存管理

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      内存管理技术,即内存的申请和释放,使用X- ...

  7. anu - browser

    import { oneObject, recyclables, typeNumber } from "./util"; //用于后端的元素节点 export function D ...

  8. Iterator、Iteratable与ListIterator

    Iteratable: public interface Iterable<T> { Iterator<T> iterator(); default void forEach( ...

  9. Spring Cloud Sleuth进阶实战

    转载请标明出处: http://blog.csdn.net/forezp/article/details/76795269 本文出自方志朋的博客 为什么需要Spring Cloud Sleuth 微服 ...

  10. TimeSpan格式化字符串格式(摘)

    一直在用DateTime, 却不常用TimeSpan , 今天突然用到了, 发现不知道咋做格式化...百度一下,找到了答案, 在这记录一下, 免得以后找花费时间 以下内容摘抄自 Microsoft D ...