天天看點

童鞋,[HttpClient發送檔案] 的技術實踐請查收

前幾天有個童鞋在群裡面問:怎麼使用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

歡迎關注我的原創技術、職場公衆号, 加好友談天說地,一起進化

童鞋,[HttpClient發送檔案] 的技術實踐請查收