你們好,我是許飛,微軟拼音的開發實習生。在網絡編程中,常常用到從服務器上「下載」一些數據,有時卻要向服務器「上傳」數據。曾在一個原型中使用了「multipart/form-data」格式向Web服務器上傳文件,這裏和你們分享。
------------------------------------------------------------------
有時,在網絡編程過程當中須要向服務器上傳文件。Multipart/form-data是上傳文件的一種方式。html
Multipart/form-data其實就是瀏覽器用表單上傳文件的方式。最多見的情境是:在寫郵件時,向郵件後添加附件,附件一般使用表單添加,也就是用multipart/form-data格式上傳到服務器。編程
表單形式上傳附件瀏覽器
具體的步驟是怎樣的呢?服務器
首先,客戶端和服務器創建鏈接(TCP協議)。網絡
第二,客戶端能夠向服務器端發送數據。由於上傳文件實質上也是向服務器端發送請求。編碼
第三,客戶端按照符合「multipart/form-data」的格式向服務器端發送數據。spa
Multipart/form-data的格式是怎樣的呢?3d
既然Multipart/form-data格式就是瀏覽器用表單提交數據的格式,咱們就來看看文件通過瀏覽器編碼後是什麼樣子。orm
HTML表單htm
瀏覽器打開的表單
點擊「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」。