HTTP上傳檔案的總結

2021-08-25 05:50:09 字數 3596 閱讀 9727

因為工作中做個客戶端,需要和web後端打交道,用的都是http的介面。對http介面也不是很熟,就自己搭個環境測試了解這個過程。

後端就隨便選用乙個可以用的框架就好了。框架反正都是呼叫api基本都是乙個套路,平台搭建好了調調介面解析一下就ok了。而這裡主要著重於http協議進行分析,從而對http有直觀的認識。

2.2.命令列傳送http請求

3.post上傳檔案

2.分析

整個網路通訊採用http通訊。後面會按幾個功能進行單獨分析。

客戶端這邊用c++,使用libcurl的庫,執行在某類u系統上。編譯這邊的環節省略,一般系統會自帶有這個庫。關於這個庫的使用,建議參考官方文件和test。

伺服器這端採用apache+php的框架,跑在ubuntu系統上。

然後整個過程保持網路暢通。。。。

方法1libcurl庫提供乙個介面選項:

curl_easy_setopt(curl, curlopt_verbose, 1);
在執行前開啟此介面即可檢視通訊過程的資訊,也可以看到報文內容

方法2伺服器端檢視報文。可以在請求指令碼裡將接收到的報文定向輸出到檔案。

方法3借助網路抓包工具。抓包工具有很多,這裡可以用wireshark。wirshark的功能比較多,這裡我用過濾器去過濾出我需要的監聽資訊就好了。

因為我知道伺服器的ip,所以可以在過濾器裡填寫:

ip.dst == xx.xx.xx.xx  or ip.src == xx.xx.xx.xx
然後監聽,這個過程中請求的資料就會**捉下來了

其實這個工具用來了解整個網路協議是挺好的,然後我們只需要http/txt,選中這個工具。

這裡可以檢視流資料資訊以及通訊流程。具體流資料的解析詳見後面。

傳送http請求可以是用curl工具,本身他就是libcurl庫的乙個產物工具。它相當於把基本功能都整合在乙個命令裡了。

如果使用curl詳見man參考文件或者其他資料。如果要檢視通訊的詳細過程可以加上-v引數。

這裡不再用簡單的get或post請求來做示範,而是來解釋傳送檔案。為此特地找了個大小較大的xml檔案作為傳送資料,伺服器僅接受資料,應答隨意。這裡用表單的方式進行資料填充,之前還是過直接填入到報文主體,也是ok的。其實說到底還是乙個資料解析的問題。

curl命令

curl命令中又乙個-f 的引數將會以multipart/form-data傳送post資料;如果是傳送檔案的話,需要在引數前面加@。

客戶端**

bool send_postreq(const char *url, const char *filename)

curl_global_cleanup();

curl_formadd(&formpost, &lsptr, //填寫表單

}

這裡有幾個比較坑的點:

1.這種easy模式採用的是阻塞的,也就是說當網路產生卡頓的時候,有一定機率會被阻塞到curl_easy_perform這個函式裡。最坑的是即使網路恢復,也不能出來。所以這裡解決這個問題有幾個方式。乙個是curl_easy_setopt(curl, curlopt_timeout, 10l)來設定超時時間。而是開多執行緒來管理每個curl_easy_perform,同時萬一被阻塞了還要想辦法終止它。還有一種是可以參考multi模式。

2.關於ssl的問題

之前設定curlopt_ssl_verifypeer和curlopt_ssl_verifyhost兩個選項的值一直沒用,其實參考官方test會發現,是對curl_global_init(curl_global_default)的設定值有要求。這種配置情況下,http和https是通用的。

3.curl_formadd官方好像並不推薦用這個???

連線和斷開

http是建立與tcp上的,因此一下子就能看到3次握手4次揮手的協議。

三次握手:

四次揮手:

整個過程:

http的資料

從wireshark上看很明顯發現是被是資料被分割傳送了。這個數字應該和最大傳送單元(mtu)有關。我們看到的資料單位是1500,可以從seq來得知當前收到資料的位置。當收到最後乙個包的時候,就被標示成了http/xml協議。

這裡的分包其實就是tcp的拆包和滑動視窗來接受資料。

報文主體格式

關於檔案大小:

通過http顯示報文得知總共資料大小:285819.而實際傳送的檔案大小是:285599.這裡的大小是指報文主體內容的大小。可以檢視資料資訊,從first boundary這裡到xml開始前的值是正好是兩個的差值。

![在這裡插入描述](

然後最後看一下用表單傳送檔案的格式:

到這裡其實已經非常清楚這個表單傳送檔案,是如何傳送的了。檔案的資料被填充到了前面關於描述content的資訊之後,直接插入到後面的文字裡。

Http上傳檔案

http上傳檔案 設定引數 string boundary datetime.now.ticks.tostring x 隨機分隔線 request.contenttype multipart form data charset utf 8 boundary boundary byte itembou...

HTTP協議上的檔案上傳

檔案上傳 tcp協議 1 http協議上的檔案上傳,最頻繁的應用場景了。rfc1867裡定義的標準http協議post報文格式如下 header 寫道 content type multipart form data body content type multipart form data,bou...

HTTP 上傳檔案的協議格式

參考 一般設定方法為post 設定 content type multipart form data boundary 7d62bf2f9066c 其中boundary後面表示多個檔案之間的分隔符 然後在請求body中按如下例子格式填充資料 7d62bf2f9066c content disposi...