关于.NET winform模拟HttpWebRequest POST上传文件需要注意的几个地方

*注意事项

        要设置分割线 ,其中分割线无论是否包含“--”,在组装消息头时都要加上“--”(两个 “-”),结束时也要加上“--”(两个 “-”)另外,

        建议在开发的时候可以使用Fiddler抓包工具来测试自己的请求信息,与成功的信息对比。

具体方法如下:

        /// <summary>
        /// 上传文件时的设置
        /// </summary>
        private static void SetMessage(HttpWebRequest webRequest, string urlString,string uploadLocalPath) {
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(urlString);
            webRequest.ContentType = "multipart/form-data";

            //参数分割线
            string boundary = "-----" + DateTime.Now.Ticks.ToString();
            webRequest.ContentType += "; boundary=" + boundary;//添加分割线,告诉服务器自定义分割线是什么
            
            //设置POST消息头
            StringBuilder startStrBuilder = new StringBuilder();
            startStrBuilder.AppendFormat("--{0}", boundary);//此处注意开头要添加 -- ,无论分割线中是否包含 --
            startStrBuilder.Append("\r\n");
            startStrBuilder.Append("Content-Disposition: form-data; name=\"editorFiles\"; filename=\"");
            startStrBuilder.Append(Path.GetFileName(uploadLocalPath));
            startStrBuilder.Append("\"");
            startStrBuilder.Append("\r\n");
            startStrBuilder.Append("Content-Type: image/jpeg");
            startStrBuilder.Append("\r\n");
            startStrBuilder.Append("\r\n");
            string strPostHeader = startStrBuilder.ToString();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);

            //POST消息尾
            StringBuilder endStrBuilder = new StringBuilder();
            endStrBuilder.Append("\r\n");
            endStrBuilder.AppendFormat("--{0}--", boundary); //此处开头与尾注意要添加 -- ,无论分割线中是否包含 --
            endStrBuilder.Append("\r\n");
            byte[] boundaryBytes = Encoding.UTF8.GetBytes(endStrBuilder.ToString());


            using (FileStream fs = new FileStream(uploadLocalPath, FileMode.Open, FileAccess.Read)) {
                long length = postHeaderBytes.Length + fs.Length + boundaryBytes.Length;
                webRequest.ContentLength = length;
                using (Stream requestStream = webRequest.GetRequestStream()) {
                    //写入消息头
                    requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

                    //写入文件内容
                    byte[] buffer = new byte[checked((uint)Math.Min(4096, (int)fs.Length))];
                    int bytesRead = 0;
                    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0) {
                        requestStream.Write(buffer, 0, bytesRead);
                    }

                    //写入消息尾部
                    requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                }
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章