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

2022-01-29 dotNET跨平臺

    昨天有童鞋在群裡面問:怎麼使用HttpClient發送文件?

      之前我寫了一個《ABP小試牛刀之上傳文件》,主要體現的是服務端,上傳文件的動作是由前端小姐姐完成的, 我還真沒有用HttpClient編程方式發送過文件。

不過HttpClient的動作遵守Web協議,盲猜httpclient按照前端multipart/form-data媒體類型發送文件應該也是可行的。

花一個小時閱讀了MDN Web協議,寫就了HttpClient發送文件的實例, 看官自取。

頭腦風暴


      我們跟隨常見的表單上傳文件思路來實現HttpClinet上傳文件。

multipart/form-data是一種由多部分表單域值組成的媒體類型,每部分由邊界線(一個由'--'開始的字符串)劃分。

如下面的表單, 有三個待提交input表單欄位

<form action="http://localhost:8000/" method="post" enctype="multipart/form-data">
  <input type="text" name="myTextField">
  <input type="checkbox" name="myCheckBox">Check</input>
  <input type="file" name="myFile">
  <button>Send the file</button>
</form>

選中文件,點擊[Send the file]按鈕,提交表單,會發出如下請求

請觀察由boundary劃分的每個表單域和值, 其中myFile是一個文件表單域, 這個文件域需要單獨指定Content-Type類型。

       以上就是常規的Html表單上傳文件的協議分析,回到本文主題, 這次會使用HttpClient編碼形式發送只含有一個文件表單域的請求 (依舊利用的multipart/form-data媒體類型), 這也是下文的實現思路。

下面是httpclient向localhost:5000/upload地址上傳文件, 伺服器返回圖片的base64編碼字符串。

3.1 客戶端

using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    class Program
    {
        static readonly HttpClient client = new HttpClient();
        static async Task Main()
        {
            try
            {
                byte[] bytes;
                using (var bodyStream = new FileStream(@"D:\001.png", FileMode.Open))
                {
                    using var m = new MemoryStream();
                    await bodyStream.CopyToAsync(m);
                    bytes = m.ToArray();
                }
                // 1. 準備文件表單域和值
                var byteArrayContent = new ByteArrayContent(bytes);
                byteArrayContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/png");

                // 2.  向MultipartFormDataContent插入準備好的文件表單域值, 注意MultipartFormDataContent是一個集合類型。
                var response = await client.PostAsync("http://localhost:5000/upload", new MultipartFormDataContent(Guid.NewGuid().ToString())
                    {
                        { byteArrayContent, "uploadedFile", "\"001ggg.png\""}
                    });

                response.EnsureSuccessStatusCode();
                var responseBody = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseBody);
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine("\nException Caught!");
                Console.WriteLine("Message :{0} ", e.Message);
            }
        }
    }
}

•請注意,我使用一個隨機的GUID做為每個表單域的劃分邊界,這裡我向MultipartFormDataContent只插入了一個文件表單閾值,這樣就做到了HttpClient發送文件。•文件表單域值:  { byteArrayContent, "uploadedFile", "\"001ggg.png\""} 中的參數2: 欄位名稱很重要,要與下面服務端的參數名匹配。

3.2 服務端

上傳文件的代碼在《ABP小試牛刀之上傳文件》一文已經體現,本次截取接收文件上傳的核心代碼

[Consumes("multipart/form-data")]
[Route("upload")]
[ProducesResponseType(typeof(Guid), 200)]
[HttpPost]
public async Task<string> UploadAsync(IFormFile uploadedFile)
{
     var formFileName = uploadedFile.FileName;
     if (!new[] { ".png", ".jpg", ".bmp" }.Any((item) => formFileName.EndsWith(item)))
     {
           throw new NotImplementedException("您上傳的文件格式必須為png、jpg、bmp中的一種");
     }
     byte[] bytes;
     using (var bodyStream = uploadedFile.OpenReadStream())
     {
         using (var m = new MemoryStream())
         {
            await bodyStream.CopyToAsync(m);
            bytes = m.ToArray();
         }
     }
     var base64 = Convert.ToBase64String(bytes);
     return base64;
}

碼甲哥從不打誑語,啟動客戶端/服務端

3.3 授人以漁

成熟的技術必須有成熟的調試和監測手段!

成熟的技術必須有成熟的調試和監測手段!

成熟的技術必須有成熟的調試和監測手段!

每當做web開發出現阻塞的時候,我就掏出web利器Fiddler,跟著Fiddler去策馬奔騰吧。

# 全文總結

1.對常規html表單上傳文件的功能,做協議級分析。2.根據分析結果,HttpClient使用同樣的姿勢發送文件: 使用multipart/form-data(多部分表單媒體類型)發起上傳請求。

[1] 媒體類型MIME: https://developer.mozilla.org/zhCN/docs/Web/HTTP/Basics_of_HTTP/MIME_types

我是有態度的馬甲,不追熱點,原創輸出 # 八股文 # 硬核乾貨 # 職場心得 #,歡迎關注。

相關焦點

  • [專欄精選]Unity中的Git最佳實踐
    本文節選自洪流學堂公眾號技術專欄《大話Unity2018》,未經允許不可轉載。
  • 童鞋,使用保密信箱,你好我也好!
    還有1個小時,「雙11」就到了,收發室已做好迎接收發快遞衝擊波的準備,在這裡老吳和小夥伴們提醒童鞋們,郵寄地址記得使用「保密信箱地址」哦~~因為用了「保密信箱地址」後「你好我也好」!➤沒有寫保密郵箱地址的童鞋來取快遞時是這樣子的:兵小妹:班長,領取兵小妹的快遞。收發員:你好,童鞋,請問你寫的是多少號保密信箱?兵小妹:額~~,班長我沒寫。收發員:那你的地址寫了具體單位了嗎?兵小妹:哦,班長,我們為了保密沒敢寫清具體單位。
  • 超詳細的HP4729安裝操作指南(不會操作印表機的童鞋請收藏)
    如果選您擇「存儲到文件」,選擇存儲到HP Smart 文件夾中,再打開HP Smart程序即可找到該文件進行分頁、調整並列印。步驟四(蘋果手機版):若選擇「存儲到文件」,您需要再打開 HP Smart 程序,點擊文件一欄。
  • DNF9.21日國慶版本大更新 發送在線截圖即得100Q幣、黑鑽
    無憂姐2017年最大的一波福利活動來了,請不要放過任何一個細節往下看。
  • 「K8s 技術落地實踐」從平臺到應用,Prometheus在K8s上的監控實踐
    一、Kubernetes 上的多租戶與多集群告警實踐介紹:K8s 上支持高並發創建、高性能運行告警,同時支持告警服務水平擴展、告警自身健康檢查、告警節點自動故障遷移的功能;此外,告警服務提供多租戶、自定義告警規則、告警抑制、發送時間段控制、靈活的通知方式等功能。
  • 報考指南請查收
    本專業主要學習思想政治基礎、軍事基礎、自然科學基礎、人文社會基礎、領導管理基礎,培養學員科學素質、人文素質、軍事素質,具備創新實踐能力和戰場指揮管理能力;學習電氣工程基礎、電力變換技術、電力拖動系統及其自動控制技術和裝甲車輛電氣電子系統等專業課程
  • 部分CIA的漏洞利用工具乾貨請查收
    但一名知情的前情報員工斯諾登似乎認為這些文件是真實的。其中有一項利用DLL攻擊技術的實例,CIA的某員工是著名演員威爾·法瑞爾的粉絲。「RickyBobby」計劃(參見https://wikileaks.org/ciav7p1/cms/page_15728810.html)就是以法瑞爾在電影《塔拉德加之夜》(Talladega Nights)中飾演的角色Ricky Bobby命名。
  • 您的喜報已送達,請查收!
    據悉,該縣下一步還將聯合軍隊單位採取軍地媒體相結合、線上與線下相結合、送出去與請進來相結合的方式,為立功官兵舉行隆重頒獎儀式,讓官兵及其家屬更加深刻感受到組織關懷,一同分享喜悅。■劉 慎 周 超寒風凜冽、大雪紛飛,冬季的帕米爾高原上像蓋了一層雪白棉被,連綿起伏的山峰被裹得嚴嚴實實。1月5日,位於祖國最西陲的新疆烏恰縣託雲鄉一如往日的寂靜。
  • 民生銀行:基於 F5 技術實現 Kubernetes 生產環境最佳實踐
    F5 方案中,可以通過本身的 HSL 功能實現最高每秒 20 萬日誌的發送,同時可以配合 requestlog 或 irules 方式可以讀取到所有應用層數據,方案網絡故障排除及系統層分析,為大數據平臺提供數據支撐。安全防護能力:F5 本身提供了大量的安全功能,包括 SSL、訪問控制、應用防護等。開源方案只提供了基本的應用分發功能,沒有安全功能擴展。
  • 雲原生安全技術分享|ATT&CK威脅檢測技術在雲工作負載的實踐
    本文主要圍繞ATT&CK發展態勢、落地ATT&CK的思考與實踐、安全狗基於ATT&CK框架進行攻防實戰的案例以及總結與展望等四大部分進行內容分享。在第1章,筆者將和大家分享對ATT&CK的背景以及發展趨勢的看法。
  • 首次揭秘PaddlePaddle核心技術與實踐(下)
    本文是《首次揭秘PaddlePaddle核心技術與實踐》的下篇,主要介紹:PaddlePaddle的新特性、大規模稀疏數據分布式模型訓練、移動端深度學習技術及應用實踐等。下半部分的內容同樣精彩,小編繼續逐個解析。
  • Gmail失聯或影響留學申請,請及時翻牆
    這就是說你只要身在大陸,不但不能使用Gmail發送郵件,也不能接收Gmail發來的郵件,無論使用哪種方式登錄郵箱(據說有一些幸運的童鞋已經可以不翻牆直接登錄Gmail,希望大家都能如此)。而如今美國大部分大學使用Gmail郵箱系統,如美國UC系統。目前每年大陸申請美國大學(本科和研究生)的人數超過7萬人。  據悉,從上周末開始,不少網友反映,Gmail客戶端無法登陸,無法收發郵件。
  • WhatsApp修復了黑客利用MP4文件攻擊設備的漏洞
    WhatsApp修復了一個涉及惡意MP4 視頻文件的漏洞,該漏洞可能允許攻擊者遠程訪問存儲在應用程式中的消息和文件。
  • 【四十完小】童心戰「疫」 為愛發聲 ——一封來自郴州日報給同學們的「空中邀請函」請查收
    三、投稿方式1、徵稿時間為即日起至2月20日,在此期間,請將你的作品發送到投稿郵箱:q592612216@163.com。郵件主題請註明「郴州加油!」內文請註明你的姓名、學校、指導老師、聯繫電話。疫情防控期間,不收取紙質作品。作文、手抄報、漫畫等作品請拍照後,以附件形式發送原圖。四、獎勵方式1、作品一經採用即在「今日郴州」app上進行展示。
  • 2020中國衛星應用大會最新日程,請查收
    屆時,大會將邀請有關政府領導、國內外權威專家學者、行業領袖匯聚一堂,通過解政策、探趨勢、聚場景、觀展示等方式,總結、梳理我國衛星應用產業的新產品、新技術、新服務,推動我國衛星應用產業加速發展。邀請有關政府領導出席開幕式並致辭,國內權威院士做主題報告,行業領袖專家做主題演講,共同解析國家戰略、分享實踐經驗、探索發展路徑。  (二)專題論壇。會議期間還將組織多場高峰論壇,邀請產業代表、研究機構、衛星技術服務商,圍繞「5G、6G與衛星通信的融合」「遙感大數據」「衛星天地一體信息網絡」「衛星在各行業的應用」等專題進行主題報告和深入實踐分析,聚焦應用場景,探索發展範式。
  • VC++6.0串口通信技術資料:軟體/源碼/論文/書籍/視頻/控制項/程序
    總目錄如下所示:資料01.VC++6.0安裝源文件資料02.VC++串口通信源碼資料03.VC++串口通信技術文章資料04.VC++串口通信電子書籍資料05.VC++串口通信視頻教程資料06.VC++串口通信控制項資料07.虛擬串口軟體及使用教程
  • ClickHouse 在有贊的實踐之路
    ClickHouse 數據按列進行存儲,每一列都有對應的 mrk 標記文件,bin 文件。mrk 文件與主鍵索引對齊,主要用於記錄數據在 bin 文件中的偏移量信息。查詢時通過對主鍵索引進行二分查找,定位到對應的 mrk 標記文件,進而找到對應的 bin 文件的偏移量,最終掃描得到相應的數據,避免了全表掃描,從而加速查詢。