HttpWebRequest上传图片Post到接口

1.对照Fiddler  Post图片的方式,例如上传2张图片在fiddler中是这样的格式

---------------------------acebdf13572468
Content-Disposition: form-data; name="file"; filename="Chrysanthemum.jpg"
Content-Type: application/octet-stream


<@INCLUDE *C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg*@>
---------------------------acebdf13572468
Content-Disposition: form-data; name="file"; filename="Desert.jpg"
Content-Type: application/octet-stream


<@INCLUDE *C:\Users\Public\Pictures\Sample Pictures\Desert.jpg*@>
---------------------------acebdf13572468--


2.使用HttpWebRequest实现

 var files = HttpContext.Request.Files; //从前端接收到的文件集合

 Uri _uri = new Uri(“请求地址”);  //创建请求地址

                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(_uri);  //创建请求对象

                ASCIIEncoding encoding = new ASCIIEncoding(); //初始化编码对象

                string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线

                request.Method = "POST"; //请求方式为Post类型

                request.ContentType = "multipart/form-data;boundary=" + boundary;   //请求类型 对照fiddler Content-Type: multipart/form-data; boundary=----------acebdf13572468

                byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n"); //仿照上面的fiddler格式建立最后一个分割线

                Stream requestStream = request.GetRequestStream(); //创建即将post给对方的请求流

                Stream fileStream = null;
                for (int i = 0; i < files.Count; i++)   //遍历文件集合
                {
                    HttpPostedFileBase file = files[i];        //获取当前文件对象


                    StringBuilder sb = new StringBuilder();
                    sb.Append("--");
                    sb.Append(boundary);
                    sb.Append("\r\n");
                    sb.Append("Content-Disposition: form-data; name=\"");
                    sb.Append("file");
                    sb.Append("\"; filename=\"");
                    sb.Append(file.FileName);
                    sb.Append("\"");
                    sb.Append("\r\n");
                    sb.Append("Content-Type: ");
                    sb.Append("application/octet-stream");
                    sb.Append("\r\n");
                    sb.Append("\r\n");

                    //上面拼出了对应的fidder格式的头即对应fiddler的下面内容

                   //---------------------------acebdf13572468
                   //Content-Disposition: form-data; name="file"; filename="Chrysanthemum.jpg"
                   //Content-Type: application/octet-stream

                    string strPostHeader = sb.ToString();
                    byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);
                    requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);  //把头部转为数据流放入到请求流中去


                    fileStream = file.InputStream;
                    byte[] fileByte = new byte[fileStream.Length];
                    fileStream.Read(fileByte, 0, (int)fileStream.Length);
                    requestStream.Write(fileByte, 0, fileByte.Length);   // 将文件流转为数据流放入到请求流中去,这部分对应fiddler中的

                                                                                                    //<@INCLUDE *C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg*@>

                    byte[] temp = Encoding.UTF8.GetBytes("\r\n");
                    requestStream.Write(temp, 0, temp.Length);        //结尾加了一个换行\r\n的目的是因为确保下一个分割线另起一行,这个分隔符一定要换行展示不然会报错
                    file.InputStream.Close();                                        //参照fiddler的布局
                }
                requestStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);  //结尾加上结束分隔符对应fiddler的---acebdf13572468--
                requestStream.Close();
                HttpWebResponse _response = (HttpWebResponse)request.GetResponse();
                StreamReader reader = new StreamReader(_response.GetResponseStream(), Encoding.UTF8);
                string content = reader.ReadToEnd();


版权声明:本文为yindubing原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。