php专区

 首页 > php专区 > PHP应用 > 开放平台 > .net mvc 微信开发笔记(六)------上传文件,菜单事件

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

分享到:
【字体:
导读:
          给用户回复图片,发送图文,视频,语音,都要先把照片 视频 语音上传到微信服务器上面。 再根据返回的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("rn--" + boundary + "rn");

            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}"rnContent-Type: {2}rnrn";
            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("rn--" + boundary + "--rn");
            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解析,获取用户普通消息:
http://www.2cto.com/weixin/201408/324777.html 

分享到:
大齐玩转微信公众账号系列(二):微信公...
 此系列博文目录: 如何申请微信公众帐号 微信公众账号消息那些事儿 服务号实现自定义菜单 微信公众账号开发入门(原理)微信公众账号开发:URL 和 Tocken   上文提到如何注册公众账号,相信很多朋友已经有自己的公众账号了,这篇博文主要向大家介绍公众账号消息的发送、回复、以及一些小窍门;(只介绍文本消息和...
.net mvc 微信开发笔记(五)------JSON解...
开发者与微信服务器的通信过程: 一.微信主动发送给开发者信息 二.开发者主动发送给微信信息 上一节简单介绍了第一部分,现在来讨论第二部分。 这里主要涉及到JSON数据的解析和发送,以"自定义菜单创建接口"为例 我们观察这个api: POST(请使用https协议) https://api.weixin.qq.com...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……