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 }
二、 永久素材上传方法
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 }
三、临时文件上传方法
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 }
以上就是本人所用单个素材上传的部分代码(大部分来自百度),在此遇到一个问题,就是上传视频素材的时候,接口会返回-1(系统繁忙,此时请开发者稍候再试),返回的频率还挺高,不知道有没有高手遇到,求告知,tks.
浙公网安备 33010602011771号