asp.net中微信开发过程之素材上传

1、微信官网申请服务号(过程自己百度),主要是获取Access_Token

2、

  一、视频素材上传方法

  1         /// <summary>
  2         /// 上传视频文件方法
  3         /// </summary>
  4         /// <param name="url">接口</param>
  5         /// <param name="filePath">文件路径</param>
  6         /// <param name="title">文件标题</param>
  7         /// <param name="introduction">文件描述</param>
  8         /// <returns></returns>
  9         public static string GetUploadVideoResult(string url, string filePath, string title, string introduction)
 10         {
 11             var fileDictionary = new Dictionary<string, string>();
 12             fileDictionary["media"] = filePath;
 13             fileDictionary["description"] = string.Format("{{\"title\":\"{0}\", \"introduction\":\"{1}\"}}", title, introduction);
 14 
 15             string returnText = string.Empty;
 16             Dictionary<string, string> postDataDictionary = null;
 17             using (MemoryStream ms = new MemoryStream())
 18             {
 19                 postDataDictionary.FillFormDataStream(ms); //填充formData
 20                 returnText = HttpPost(url, null, ms, fileDictionary, null, null, 1200000);
 21             }
 22             return returnText;
 23         }
 24                 /// <summary>
 25         /// 填充表单信息的Stream
 26         /// </summary>
 27         /// <param name="formData"></param>
 28         /// <param name="stream"></param>
 29         public static void FillFormDataStream(this Dictionary<string, string> formData, Stream stream)
 30         {
 31             string dataString = GetQueryString(formData);
 32             var formDataBytes = formData == null ? new byte[0] : Encoding.UTF8.GetBytes(dataString);
 33             stream.Write(formDataBytes, 0, formDataBytes.Length);
 34             stream.Seek(0, SeekOrigin.Begin);//设置指针读取位置
 35         }
 36 
 37         /// <summary>
 38         /// 组装QueryString的方法
 39         /// 参数之间用&连接,首位没有符号,如:a=1&b=2&c=3
 40         /// </summary>
 41         /// <param name="formData"></param>
 42         /// <returns></returns>
 43         public static string GetQueryString(this Dictionary<string, string> formData)
 44         {
 45             if (formData == null || formData.Count == 0)
 46             {
 47                 return "";
 48             }
 49 
 50             StringBuilder sb = new StringBuilder();
 51 
 52             var i = 0;
 53             foreach (var kv in formData)
 54             {
 55                 i++;
 56                 sb.AppendFormat("{0}={1}", kv.Key, kv.Value);
 57                 if (i < formData.Count)
 58                 {
 59                     sb.Append("&");
 60                 }
 61             }
 62 
 63             return sb.ToString();
 64         }
 65 
 66         /// <summary>
 67         /// 根据完整文件路径获取FileStream
 68         /// </summary>
 69         /// <param name="fileName"></param>
 70         /// <returns></returns>
 71         public static FileStream GetFileStream(string fileName)
 72         {
 73             FileStream fileStream = null;
 74             if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName))
 75             {
 76                 fileStream = new FileStream(fileName, FileMode.Open);
 77             }
 78             return fileStream;
 79         }
 80         /// <summary>
 81         /// 使用Post方法获取字符串结果
 82         /// </summary>
 83         /// <param name="url"></param>
 84         /// <param name="cookieContainer"></param>
 85         /// <param name="postStream"></param>
 86         /// <param name="fileDictionary">需要上传的文件,Key:对应要上传的Name,Value:本地文件名</param>
 87         /// <param name="timeOut">超时</param>
 88         /// <returns></returns>
 89         public static string HttpPost(string url, CookieContainer cookieContainer = null, Stream postStream = null, Dictionary<string, string> fileDictionary = null, string refererUrl = null, Encoding encoding = null, int timeOut = 1200000)
 90         {
 91             try
 92             {
 93                 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
 94                 request.Method = "POST";
 95                 request.Timeout = timeOut;
 96 
 97                 #region 处理Form表单文件上传
 98                 var formUploadFile = fileDictionary != null && fileDictionary.Count > 0;//是否用Form上传文件
 99                 if (formUploadFile)
100                 {
101                     //通过表单上传文件
102                     postStream = postStream ?? new MemoryStream();
103 
104                     string boundary = "----" + DateTime.Now.Ticks.ToString("x");
105                     //byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
106                     string fileFormdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
107                     string dataFormdataTemplate = "\r\n--" + boundary +
108                                                   "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
109                     foreach (var file in fileDictionary)
110                     {
111                         try
112                         {
113                             var fileName = file.Value;
114                             //准备文件流
115                             using (var fileStream = GetFileStream(fileName))
116                             {
117                                 string formdata = null;
118                                 if (fileStream != null)
119                                 {
120                                     //存在文件
121                                     formdata = string.Format(fileFormdataTemplate, file.Key, /*fileName*/ Path.GetFileName(fileName));
122                                 }
123                                 else
124                                 {
125                                     //不存在文件或只是注释
126                                     formdata = string.Format(dataFormdataTemplate, file.Key, file.Value);
127                                 }
128                                 //统一处理
129                                 var formdataBytes = Encoding.UTF8.GetBytes(postStream.Length == 0 ? formdata.Substring(2, formdata.Length - 2) : formdata);//第一行不需要换行
130                                 postStream.Write(formdataBytes, 0, formdataBytes.Length);
131 
132                                 //写入文件
133                                 if (fileStream != null)
134                                 {
135                                     byte[] buffer = new byte[1024];
136                                     int bytesRead = 0;
137                                     while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
138                                     {
139                                         postStream.Write(buffer, 0, bytesRead);
140                                     }
141                                 }
142                             }
143                         }
144                         catch (Exception ex)
145                         {
146                             throw ex;
147                         }
148                     }
149                     //结尾
150                     var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
151                     postStream.Write(footer, 0, footer.Length);
152 
153                     request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
154                 }
155                 else
156                 {
157                     request.ContentType = "application/x-www-form-urlencoded";
158                 }
159                 #endregion
160 
161                 request.ContentLength = postStream != null ? postStream.Length : 0;
162                 request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
163                 request.KeepAlive = true;
164 
165                 if (!string.IsNullOrEmpty(refererUrl))
166                 {
167                     request.Referer = refererUrl;
168                 }
169                 request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";
170 
171                 if (cookieContainer != null)
172                 {
173                     request.CookieContainer = cookieContainer;
174                 }
175 
176                 #region 输入二进制流
177                 if (postStream != null)
178                 {
179                     postStream.Position = 0;
180                     //直接写入流
181                     Stream requestStream = request.GetRequestStream();
182 
183                     byte[] buffer = new byte[1024];
184                     int bytesRead = 0;
185                     while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) != 0)
186                     {
187                         requestStream.Write(buffer, 0, bytesRead);
188                     }
189                     //debug
190                     postStream.Seek(0, SeekOrigin.Begin);
191                     StreamReader sr = new StreamReader(postStream);
192                     var postStr = sr.ReadToEnd();
193                     postStream.Close();//关闭文件访问
194                 }
195                 #endregion
196 
197                 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
198                 if (cookieContainer != null)
199                 {
200                     response.Cookies = cookieContainer.GetCookies(response.ResponseUri);
201                 }
202                 using (Stream responseStream = response.GetResponseStream())
203                 {
204                     using (StreamReader myStreamReader = new StreamReader(responseStream, encoding ?? Encoding.GetEncoding("utf-8")))
205                     {
206                         string retString = myStreamReader.ReadToEnd();
207                         return retString;
208                     }
209                 }
210             }
211             catch
212             { return ""; }
213         }
View Code

      二、 永久素材上传方法

 1         /// <summary> 
 2         /// Http上传文件(上传接口地址,文件路径、上传类型(image、voice、video、thumb))
 3         /// </summary>
 4         public static string HttpUploadFile(string url, string path, string contenttype)
 5         {
 6             try
 7             {
 8                 int index = path.LastIndexOf("\\");
 9                 string fileName = path.Substring(index + 1);
10                 //文件
11                 FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
12                 BinaryReader br = new BinaryReader(fileStream);
13                 byte[] buffer = br.ReadBytes(Convert.ToInt32(fileStream.Length));
14                 string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
15                 //请求
16                 WebRequest req = WebRequest.Create(url);
17                 req.Method = "POST";
18                 req.ContentType = "multipart/form-data; boundary=" + boundary;
19 
20                 //组织表单数据
21                 StringBuilder sb = new StringBuilder();
22                 sb.Append("--" + boundary + "\r\n");
23                 sb.Append("Content-Disposition: form-data; name=\"media\"; filename=\"" + fileName + "\"; filelength=\"" + fileStream.Length + "\"");
24                 sb.Append("\r\n");
25                 sb.Append("Content-Type: " + contenttype);
26                 sb.Append("\r\n\r\n");
27                 string head = sb.ToString();
28                 byte[] form_data = Encoding.UTF8.GetBytes(head);
29 
30                 //结尾
31                 byte[] foot_data = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
32 
33                 //post总长度
34                 long length = form_data.Length + fileStream.Length + foot_data.Length;
35                 req.ContentLength = length;
36                 Stream requestStream = req.GetRequestStream();
37                 requestStream.ReadTimeout = 3000;
38 
39                 //这里要注意一下发送顺序,先发送form_data > buffer > foot_data
40                 //发送表单参数
41                 requestStream.Write(form_data, 0, form_data.Length);
42                 //发送文件内容
43                 requestStream.Write(buffer, 0, buffer.Length);
44                 //结尾
45                 requestStream.Write(foot_data, 0, foot_data.Length);
46 
47                 requestStream.Close();
48                 fileStream.Close();
49                 fileStream.Dispose();
50                 br.Close();
51                 br.Dispose();
52 
53                 req.Timeout = 3000;
54                 string html = string.Empty;
55                 //响应
56                 using (WebResponse pos = req.GetResponse())
57                 {
58                     StreamReader sr = new StreamReader(pos.GetResponseStream(), Encoding.UTF8);
59                     html = sr.ReadToEnd().Trim();
60                     sr.Close();
61                     sr.Dispose();
62                     if (pos != null)
63                     {
64                         pos.Close();
65                     }
66                 }
67                 if (req != null)
68                 {
69                     req = null;
70                 }
71                 return html;
72             }
73             catch
74             { }
75             return "";
76         }
View Code

      三、临时文件上传方法

 1         /// <summary> 
 2         /// WebClient上传文件(上传接口、文件路径) 
 3         /// </summary> 
 4         public static string WebClientUploadFile(string url, string path)
 5         {
 6             try
 7             {
 8                 using (WebClient c = new WebClient())
 9                 {
10                     string img = @path;
11                     byte[] result = c.UploadFile(url, img);
12                     string ll = Encoding.Default.GetString(result);
13                     return ll;
14                 }
15             }
16             catch
17             {
18                 return "";
19             }
20         }
View Code

 以上就是本人所用单个素材上传的部分代码(大部分来自百度),在此遇到一个问题,就是上传视频素材的时候,接口会返回-1(系统繁忙,此时请开发者稍候再试),返回的频率还挺高,不知道有没有高手遇到,求告知,tks.

posted on 2015-11-03 10:58  blog_zt  阅读(484)  评论(2)    收藏  举报

导航