来源:自学PHP网 时间:2015-04-14 12:58 作者: 阅读:次
[导读] 给用户回复图片,发送图文,视频,语音,都要先把照片 视频 语音上传到微信服务器上面。 再根据返回的media_id进行调用,详见:开发文档 http请求方式: POST FORM http: fil...
给用户回复图片,发送图文,视频,语音,都要先把照片/视频/语音上传到微信服务器上面。 再根据返回的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解析,获取用户普通消息: |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com