.net mvc 微信开发笔记(六)------上传文件,自定义菜单事件推送

来源:互联网 发布:windows 10 redstone 3 编辑:程序博客网 时间:2024/06/06 13:19

     疯了,不知道是CSDN抽风还是我忘了保存,昨晚写的博今天竟然没了。。看来又要重码一遍。。

     微信可以回复视频给用户,也可以给用户广播图文消息,而对应的图片、视频、语音等都需要用户提前上传到微信服务器。上传成功后,微信会返回给开发者一个Media_id,可以通过media_id来调用该文件。

     http请求方式: POST/FORM http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

    然我们看一下该接口所需要的参数:

    

    上传的思路大致有了,首先建一个数据包,再把文件转化为流加入数据包,同时头文件在加入content-type等信息

    最后再将数据包post到对应的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=image";                       // 上传一张图片,放在网站根目录images/carrot1.jpg下。            return HttpHelper.HttpUploadFile(url, filename);        }
     额。。为了方便理解,把上传的主要代码封装到了httphelper类中。。

     下边上类中的代码

     首先,需要参数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;        }
       获取文件类型后,就是一个封装数据包并发送的过程了

    

 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;        }
       OK,如果你按照上边的过程操作,不出意外,会返回

   {"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
       说明上传成功并得到对应的media_id

       当用户点击自定义菜单时候,微信会给开发者发送一个event事件


       服务器接收之后,我们就可以给用户回复图片或者图文了

       如何回复,参见: 

.net mvc 微信开发笔记(四)------STREAM,POST/GET,XML解析,获取用户普通消息

0 0
原创粉丝点击