http 文件傳輸
https://www.zhihu.com/question/58118565
轉載自:http://www.voidcn.com/article/p-rpdhbjib-m.html
HTTP協議用於文件傳輸時,一般把文件內容放到消息體中。作為TCP之上的流式傳輸協議,發送端和接收端可以對大文件進行流式的發送和接收。
1.確定大小的文件傳輸
消息頭部的Content-Length字段表示文件的長度,用於接收端確定文件的結束。
2.Chunked編碼
當文件大小無法事先確定時,無法設置Content-Length字段。此時可以用分塊傳輸的方式,將文件分成多個部分進行發送。在分塊發送方式下,頭部增加Transfer-Encoding: chunked,存在這個頭部時不允許再加上Content-Length頭,即使有也會被忽略。
Chunked模式下,消息體分塊發送,每一塊頭部存儲數據長度,跟上CRLF,然后是具體的數據,塊與塊之間也是CRLF分隔。當長度頭為0時,表示塊的結束。
3.使用multipart/form-data上傳文件
原始的POST請求消息體中是URL編碼后的表單,格式為key=value,不同的key、value之間用&分隔。上傳二進制的文件時,可以用multipart/form-data的方式。
在這種方式下,基礎的請求仍然是POST請求,文件內容放在消息體,只是Content-Type字段的值為multipart/form-data,並隨機選擇一個字符串作為分隔符(理論上需要這個分隔符不在文件內容中出現,一般隨機選擇的字符串出現在正文中的概率非常小,如果真的出現會導致POST失敗,需要另外發起一次請求重新選擇隨機字符串),然后,每個字段之間用”--分隔符”進行分隔,最后一個”--分隔符--”表示結束。每個字段中都可以包含頭部和消息體,頭部的內容可以包含文件名稱、文件路徑等,也可以是文件的二進制內容本身。
4.斷點續傳與多線程傳輸
這里仍然是運用分塊傳輸的思想:如果傳輸中途中斷,接下來可以從中斷的地方重新開始避免從頭開始的浪費;在多線程程序中,各個線程可以分別負責傳輸一個文件塊,然后將他們合並恢復成為原始文件。
分塊傳輸就需要確定塊的邊界,這里采用的是Range字段,表示從某一字節開始,如Range:bytes=100-,表示請求的是從文件的100字節開始到文件末尾,返回消息為206 Partial Content,頭部字段增加Content-Range: bytes100-199/200,表示返回文件100-199字節內容,文件一共200字節。
多線程傳輸時,每個線程請求文件中不同的range,傳輸完成后由應用作合並。
http和ftp文件傳輸的比較
https://www.oschina.net/news/28162/http-vs-ftp
使用Python創建簡單的HTTP和FTP服務
https://www.cnblogs.com/yili16438/p/d3209323913c6d53e6060fcd8d27e4c0.html