Net模拟http表单文件上传

来源:互联网 发布:婆婆定期揍儿媳 知乎 编辑:程序博客网 时间:2024/05/22 11:43
模拟http表单上传,要特别注意其格式:如回车换行,差一个都可能得不到正确的响应,还有请求的Content-Length一定计算对

        /// <summary>

        /// 模拟form表单上传

        /// </summary>

        /// <param name="url">路径</param>

        /// <param name="buffer">数据流</param>

        /// <param name="fileName">文件名称</param>

        /// <returns>返回响应信息</returns>

        private static string UploadFilesToRemoteUrl(string url, byte[] buffer, string fileName)

        {

            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");

            System.Net.ServicePointManager.DefaultConnectionLimit = 50;

            

            HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);

            myReq.Credentials = System.Net.CredentialCache.DefaultCredentials;

            myReq.Timeout = 5 * 60 * 1000;

            myReq.Method = "POST";

            myReq.ContentType = "multipart/form-data; boundary=" + boundary;


            StringBuilder sb = new StringBuilder();

            sb.Append("--" + boundary + "\r\n");

            sb.Append("Content-Disposition: form-data; name=\"fileName \"; filename=\"e:\\" + fileName + "\"");

            sb.Append("\r\n");

            sb.Append("Content-Type: pplication/octet-stream");

            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");


            myReq.ContentLength = buffer.Length + form_data.Length + foot_data.Length;


            myReq.KeepAlive = true;

            myReq.ProtocolVersion = HttpVersion.Version10;

            Stream requestStream = myReq.GetRequestStream();

            requestStream.Write(form_data, 0, form_data.Length);

            requestStream.Write(buffer, 0, buffer.Length);

            requestStream.Write(foot_data, 0, foot_data.Length);

            requestStream.Close();


            using (HttpWebResponse webResponse = (HttpWebResponse)myReq.GetResponse())

            {

                Stream responseStream = webResponse.GetResponseStream();

                StreamReader reader = new StreamReader(responseStream);

                string str = reader.ReadToEnd();

                return str;

            }

        }