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 上传下载多媒体文件接口的更多相关文章

  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. IOS GCDAsyncSocket

    // // ViewController.m // 05.聊天室 // // Created by apple on 14/12/5. // Copyright (c) 2014年 heima. Al ...

  2. Android(java)学习笔记42:Map集合的获取功能

    1. Map集合的获取功能:  package cn.itcast_01; import java.util.Collection; import java.util.HashMap; import ...

  3. 学大伟业 Day 4 培训总结

    今天讲的全是dp... 不多废话,先看一道经典的模板LIS(最长不下降子序列) 一.LIS 给定一个长度为N的数列,求最长上升子序列 例:1 7 2 8 3 4 答案:1 2 3 4 代码: #inc ...

  4. lucene&solr学习——索引维护

    1.索引库的维护 索引库删除 (1) 全删除 第一步:先对文档进行分析 public IndexWriter getIndexWriter() throws Exception { // 第一步:创建 ...

  5. vue2 自定义全局组件(Loading加载效果)

    vue2 自定义全局组件(Loading加载效果) github地址: https://github.com/ccyinghua/custom-global-component 一.构建项目 vue ...

  6. 自动化测试selenium教程

    什么是自动化测试: 自动帮我们测试一个系统里面的主要功能,一个app.电脑网站.网页,每个系里面许多的功能,好比一个淘宝页面,里面N多功能,登录.注册,推荐,商品详情.评论等等:软件生命周期:需求调研 ...

  7. JSTL&EL

    JSTL <1> 实现了JSP页面代码的复用 <2> 使得可读性更强 导入 <%@ taglib uri="http://java.sun.com/jsp/js ...

  8. Linux查看日志命令- more、less、tail、head命令的区别

    参考:https://blog.csdn.net/caib1109/article/details/52195942 1.more 2.tail 3.less 4.cat 5.head

  9. iOS Block界面反向传值小demo

    1.在第二个视图控制器的.h文件中定义声明Block属性: // 定义block @property (nonatomic, copy) void (^NextViewControllerBlock) ...

  10. ES6 async await

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...