您的位置:首页 > 移动开发 > 微信开发

.net mvc 微信开发笔记(六)------上传文件,菜单事件推送和响应

2014-07-28 21:42 337 查看
给用户回复图片,发送图文,视频,语音,都要先把照片/视频/语音上传到微信服务器上面。

再根据返回的media_id进行调用,详见:开发文档

http请求方式: POST/FORM http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
如何操作呢,这就是涉及到c#文件上传了。

既然需要涉及到文件上传,那肯定需要

1.文件的地址

2.上传的url

我们先写好控制器:

public string Upload() {
string filename = System.Web.HttpContext.Current.Server.MapPath("/Images/carrot1.jpg");
string url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=" + finalstr.acctoken + "&type=thumb";
//上传图片为例,地址在根目录下Images/carrot1.jpg
// 我们封装了所有操作,返回上传状态
return HttpHelper.HttpUploadFile(url, filename);
}
看一眼接口



我们需要自己模拟发送文件的过程,先创建一个包,然后加入头,文件的流,然后再封装,最后发送。OK!

当然需要传递content-type,也就是文件类型 ,那我们先写个获取方法

private static string GetContentType(FileInfo fileInfo)
{
var contentType = "";
switch (fileInfo.Extension.ToLower())
{
case ".jpg":
contentType = "image/jpeg";
break;
case ".mp3":
contentType = "audio/mp3";
break;
case ".amr":
contentType = "audio/amr";
break;
case ".mp4":
contentType = "video/mp4";
break;
default:
throw new NotSupportedException("文件格式不支持");
}

return contentType;
}
好了,有了Content-type,剩下的就是封装数据包了。

public static string HttpUploadFile(string url, string file)
{   //判断文件是否存在
if (!File.Exists(file))
{
throw new FileNotFoundException();
}

FileInfo fileInfo = new FileInfo(file);

//构造数据包前半段
string result = string.Empty;
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

var request = (HttpWebRequest)WebRequest.Create(url);
request.ContentType = "multipart/form-data; boundary=" + boundary;
request.Method = "POST";
request.KeepAlive = true;

var stream = request.GetRequestStream();
stream.Write(boundarybytes, 0, boundarybytes.Length);
//将文件写进流
var headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
var header = string.Format(headerTemplate, fileInfo.Name, file, GetContentType(fileInfo));
var headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
stream.Write(headerbytes, 0, headerbytes.Length);

var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
var buffer = new byte[4096];
var bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
stream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
//封闭数据包并发送
var trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
stream.Write(trailer, 0, trailer.Length);
stream.Close();
//发送并显示返回结果
WebResponse wresp = null;
try
{
wresp = request.GetResponse();

Stream stream2 = wresp.GetResponseStream();
StreamReader reader2 = new StreamReader(stream2);

result = reader2.ReadToEnd();
}
finally
{
if (wresp != null)
{
wresp.Close();
wresp = null;
}
}

return result;
}
好了,如果顺利的话应该会返回如下的JSON

{"type":"image","media_id":"Tki4zHH3w1qA8ilvunv-PJfnIMaoLzTlF2vRsVF4IjDx6WQLdJoF020fC4D8Yncc","created_at":1406525263}

这时候就说明文件上传成功,文件对应的media_id是Tki4zHH3w1qA8ilvunv-PJfnIMaoLzTlF2vRsVF4IjDx6WQLdJoF020fC4D8Yncc

注意上传的文件微信只保存三天,所以记得经常更新奥。

上传完文件,上一节也建好了菜单,如何点击菜单,返回图片呢?

首先用户点击菜单,会给服务器发送一个event事件,详见:点这里

我们接收并处理,然后给用户返回刚才上传的图片,如何操作,请查看:

.net
mvc 微信开发笔记(四)------STREAM,POST/GET,XML解析,获取用户普通消息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐