前幾天有個童鞋在群裡面問:怎麼使用HttpClient發送檔案?
之前我寫了一個ABP上傳檔案,主要展現的是服務端,上傳檔案的動作是由前端小姐姐完成的, 我還真沒有用HttpClient程式設計方式發送過檔案。
不過想來,Web協定都是一樣的,類比前端發送檔案,httpclient按照<code>multipart/form-data</code>媒體類型應該也是可以發送的。
花一個鐘頭閱讀了MDN Web協定,寫成了HttpClient發送檔案的執行個體, 看官自取。
我們跟随常見的表單上傳檔案思路來實作HttpClinet上傳檔案。
multipart/form-data是一種多部分的文檔格式,每部分由邊界線(一個由'--'開始的字元串)劃分, 也是一種請求的媒體類型MIME
如下面的表單, 有三個待送出input表單字段
Check
Send the file
選中檔案,點選[Send the file]按鈕,送出表單,會發出如下請求
請觀察由<code>boundary</code>劃分的每個表單域和值, 其中<code>myFile</code>是一個檔案表單域, 多一個<code>Content-Type</code>類型。
以上就是正常的Html表單上傳檔案的協定分析,回到本文主題, 這次會使用HttpClient編碼形式發送隻含有一個檔案表單域的請求 (依舊利用的<code>multipart/form-data</code>媒體類型), 這也是下文的實作思路。
下面是httpclient向<code>localhost:5000/upload</code>位址上傳檔案, 伺服器傳回圖檔的base64編碼字元串。
請注意,我使用一個随機的GUID做為每個表單域的劃分邊界,這裡我向MultipartFormDataContent隻插入了一個檔案表單門檻值,這樣就做到了HttpClient發送檔案。
檔案表單域值: <code>{ byteArrayContent, "uploadedFile", "\"001ggg.png\""}</code> 中的參數2: 字段名稱很重要,要與下面服務端的參數比對。
上傳檔案的代碼在 《》一文已經展現,本次截取接收檔案上傳的核心代碼
碼甲哥從不打诳語,啟動用戶端/服務端
成熟的技術必須有成熟的調試和監測手段!
每當做web開發出現阻塞的時候,我就掏出web利器: Fiddler。
跟着Fiddler去倒騰吧。
對正常html表單上傳檔案,做源碼級分析。
根據分析結果,HttpClient使用同樣的姿勢發送檔案: 使用<code>multipart/form-data</code>(多部分表單媒體類型)發起上傳請求。
本文來自部落格園,作者:{有态度的馬甲},轉載請注明原文連結:https://www.cnblogs.com/JulianHuang/p/15697845.html
歡迎關注我的原創技術、職場公衆号, 加好友談天說地,一起進化
