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("\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 = ;
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, , 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(, (int)fileStream.Length))];
int bytesRead = ;
while ((bytesRead = fileStream.Read(buffer, , buffer.Length)) != )
requestStream.Write(buffer, , bytesRead);
//结尾
requestStream.Write(foot_data, , 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[]; 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, , buffer.Length);
if (l > )
outStream.Write(buffer, , l);
}
while (l > ); 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调用微信上传下载多媒体文件的接口
asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文件接口的更多相关文章
- asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文
近公司项目上在开发微信服务号的接口,需要给用户回复图片或语音或视频,这个时候就需要用到 上传下载多媒体文件接口,微信在这方面推荐采用的是开源函数库curl实现的,CURL项目包括很多版本,我主要测试的 ...
- C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- NET实现微信公共平台上传下载多媒体文件(转)
举个例子,有人对着我们的公共微信号拍个照片发送过来,然后我们处理这个照片,比如进行ocr识别字(随后就会降到这个例子),或者人脸识别,或者拍照取证等,这些功能都是相当有用的.那么我们现在就要分析一下这 ...
- 使用curl / wget命令上传下载FTP
curl可以在shell下轻松上传下载ftp上的文件,相比ftp命令更具有优势,因为它能在单命令条件下,下载或者上传一个ftp文件,甚至可以删除文件. 下面看实例: 1.列出ftp服务器上的目录列表: ...
- ASP.NET MVC 微信公共平台开发之获取用户消息并处理
ASP.NET MVC 微信公共平台开发 获取用户消息并处理 获取用户消息 用户发送的消息是在微信服务器发送的一个HTTP POST请求中包含的,获取用户发送的消息要从POST请求的数据流中获取 微信 ...
- ASP.NET MVC 微信公共平台开发之验证消息的真实性
ASP.NET MVC 微信公共平台开发 验证消息的真实性 在MVC Controller所在项目中添加过滤器,在过滤器中重写 public override void OnActionExecuti ...
- ASP.NET MVC 微信公共平台开发之 微信接入
ASP.NET MVC 接入微信公共平台 申请微信公共账号 既然要接入微信公共平台,微信公共号是必须的(当然如果只是测试的话也可以申请微信公共平台接口测试账号),来这里微信公共平台 申请微信公共号(注 ...
- PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制
2013年10月06日最新整理. PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 微信公共平台消息主动推送接口一直是腾讯的私用接口,相信很多朋友都非常想要用到这个功能. 通过学习 ...
- 第三方网站不能调用微信公众平台里的图片了 显示"此图片来自微信公众号平台未经允许不可引用"
下午ytkah在自己小博客搜索时看到有几篇文章图片显示不了,再访问一些网站时发现有些图片无法显示出来,显示"此图片来自微信公众号平台未经允许不可引用",如下图所示,这个应该是最近微 ...
随机推荐
- Vision-Based Positioning for Internet-of-Vehicles
Vision-Based Positioning for Internet-of-Vehicles Introduction Ego-positioning aims at locating an o ...
- 【洛谷P2577】[ZJOI2005]午餐
午餐 题目链接 DP题都辣么毒瘤的么.. 首先,看一下题解 我们就有了思路: 贪心:显然,让吃饭慢的先打饭,sort一遍(证明?不存在的.. DP:f[i][j][k]表示前i个人,窗口1的打饭时间为 ...
- 【luogu P1111 公路修建】 题解
题目链接:https://www.luogu.org/problemnew/show/P1111 考察并查集,运用kruskal的思想很好做.注意几个小问题即可. #include<iostre ...
- Android学习笔记_52_全面了解Android开发规范:性能及UI优化
一.Android编码规范 1.java代码中不出现中文,最多注释中可以出现中文 2.局部变量命名.静态成员变量命名 只能包含字母,单词首字母出第一个外,都为大写,其他字母都为小写 3.常量命名 只能 ...
- Jquery Mobile 常用参数
data-role 属性值: data-role参数表: page 页面容器,其内部的mobile元素将会继承这个容器上所设置的属性 header 页面标题容器,这个容器内部 ...
- 使用classList来实现两个按钮样式的切换
classList属性的方法:add();remove();toggle(); 描述,在一些页面我们需要使用两个按钮来回切换,如图: 我们要使用到add()和remove()方法 html部分: &l ...
- 阻止vue事件冒泡的方法
- 菜鸟笔记 -- Chapter 6.1 面向对象概述
6.1 面向对象概述 在程序开发的初期人们使用结构化开发语言,但是随着时间的流逝,软件的规模越来越庞大,结构化语言的弊端逐渐暴露出来,开发周期被无限制拖延,产品质量也不尽如人意,人们终于发现结构化语言 ...
- Oracle数据库用户密码设为无限期
oracle数据库用户密码默认为180天,密码过期后将无法登陆数据库. 一.查询用户所属PROFILE SQL> SELECT username,PROFILE FROM dba_users; ...
- spring入门(七) spring mvc+mybatis+generator
1.Mybatis-Generator下载 地址:https://github.com/mybatis/generator/releases 我使用的是 mybatis-generator-core- ...