在網絡編程過程當中須要向服務器上傳文件。Multipart/form-data是上傳文件的一種方式。 html
Multipart/form-data其實就是瀏覽器用表單上傳文件的方式。最多見的情境是:在寫郵件時,向郵件後添加附件,附件一般使用表單添加,也就是用multipart/form-data格式上傳到服務器。 編程
表單形式上傳附件 瀏覽器
具體的步驟是怎樣的呢? 服務器
首先,客戶端和服務器創建鏈接(TCP協議)。 網絡
第二,客戶端能夠向服務器端發送數據。由於上傳文件實質上也是向服務器端發送請求。 編碼
第三,客戶端按照符合「multipart/form-data」的格式向服務器端發送數據。 3d
Multipart/form-data的格式是怎樣的呢? orm
既然Multipart/form-data格式就是瀏覽器用表單提交數據的格式,咱們就來看看文件通過瀏覽器編碼後是什麼樣子。 htm
HTML表單 blog
瀏覽器打開的表單
點擊「Browse…」分別選擇「unknow.gif」和「unknow1.gif」文件,點擊「submit」按紐後,文件將被上傳到服務器。
下面是服務器收到的數據:
服務器收到的數據
這是一個POST請求。因此數據是放在請求體內,而不是請求頭內。
這行指出這個請求是「multipart/form-data」格式的,且「boundary」是 「---------------------------7db15a14291cce」這個字符串。
不難想象,「boundary」是用來隔開表單中不一樣部分數據的。例子中的表單就有 2 部分數據,用「boundary」隔開。「boundary」通常由系統隨機產生,但也能夠簡單的用「-------------」來代替。
實際上,每部分數據的開頭都是由"--" + boundary開始,而不是由 boundary 開始。仔細看才能發現下面的開頭這段字符串實際上要比 boundary 多了個 「--」
緊接着 boundary 的是該部分數據的描述。
接下來纔是數據。
「GIF」gif格式圖片的文件頭,可見,unknow1.gif確實是gif格式圖片。
在請求的最後,則是 "--" + boundary + "--" 代表表單的結束。
須要注意的是,在html協議中,用 「\r\n」 換行,而不是 「\n」。