1. 程式人生 > >HttpWebRequest上傳圖片Post到介面

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