.NET HttpWebRequest POST 提交表单(烦人啊)
最近在研究微信公众平台接口,到了文件上传这块出现了一些问题了!!
官方说明为:

我用 HttpWebRequest 上传一个图片试试,结果服务器给我返回一个40005错误(不合法的文件类型)去百度了下,有所收获。
先看代码先:
public string UploadFile(string accesstoken, string type, string filename, string contenttype) { //文件 //判断文件是否存在 if (!File.Exists(filename)) { //不存在 return "-1"; } FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fileStream); byte[] buffer = br.ReadBytes(Convert.ToInt32(fileStream.Length)); string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); //请求 WebRequest req = WebRequest.Create(@"http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=" + accesstoken + "&type=" + type); req.Method = "POST"; req.ContentType = "multipart/form-data; boundary=" + boundary; //组织表单数据 StringBuilder sb = new StringBuilder(); sb.Append("--" + boundary + "\r\n"); sb.Append("Content-Disposition: form-data; name=\"media\"; filename=\"" + filename + "\"; filelength=\"" + fileStream.Length + "\""); sb.Append("\r\n"); sb.Append("Content-Type: " + contenttype); sb.Append("\r\n\r\n"); string head = sb.ToString(); byte[] form_data = Encoding.UTF8.GetBytes(head); //结尾 byte[] foot_data = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); //post总长度 long length = form_data.Length + fileStream.Length + foot_data.Length; req.ContentLength = length; Stream requestStream = req.GetRequestStream(); //这里要注意一下发送顺序,先发送form_data > buffer > foot_data //发送表单参数 requestStream.Write(form_data, 0, form_data.Length); //发送文件内容 requestStream.Write(buffer, 0, buffer.Length); //结尾 requestStream.Write(foot_data, 0, foot_data.Length); requestStream.Close(); fileStream.Close(); fileStream.Dispose(); br.Close(); br.Dispose(); //响应 WebResponse pos = req.GetResponse(); StreamReader sr = new StreamReader(pos.GetResponseStream(), Encoding.UTF8); string html = sr.ReadToEnd().Trim(); sr.Close(); sr.Dispose(); if (pos != null) { pos.Close(); pos = null; } if (req != null) { req = null; } return html; }
看了这个代码,我明白了。
列如:
一般表单:<form id="form1" runat="server"><form>
那么:
(1)req.ContentType = "multipart/form-data; boundary=" + boundary;
(1.1) 中的boundary变量就表示<form>标签的开始和结束(成对出现,只不过现在可以自己定义了)
(2)sb.Append("Content-Disposition: form-data; name=\"media\"; filename=\"" + filename + "\"; filelength=\"" + fileStream.Length + "\"");
(2.2)Content-Disposition 就相当于<form>标签中的属性集合。上面的代码相当于<form name="media" filename="123" fileStream=447>
以上是我的猜测,如有不正确的,请大神指出来。谢谢!!!

浙公网安备 33010602011771号