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