.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>

 

                                                以上是我的猜测,如有不正确的,请大神指出来。谢谢!!!

 

posted @ 2014-06-14 17:49  脾气不坏  阅读(752)  评论(0)    收藏  举报