HTTP 檔案上傳過程
轉載
首先來了解什麼是multipart/form-data請求:
根據http/1.1 rfc 2616的協議規定,我們的請求方式只有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等,那為為何我們還會有multipart/form-data請求之說呢?這就要從頭來說了。
http協議大家都知道是規定了以ASCII碼傳輸,建立在tcp、ip協議之上的應用層規範,規範內容把http請求分為3個部門:狀態行,請求頭,請求體。所有的方法、實現都是圍繞如何運用和組織這三部分來完成的。換句話來說就是萬變不離其中,只要我們瞭解了http請求的組成部分後,自然就可以應變任何實際工作中的需求和問題了。
關於狀態行,請求頭,請求體等三部分的具體內容,大家可以參考官方的協議文件http://www.faqs.org/rfcs/rfc2616.html,這裡主要分析multipart/form-data請求具體是怎麼一回事。
既然http協議本身的原始方法不支援multipart/form-data請求,那這個請求自然就是由這些原始的方法演變而來的,具體如何演變且看下文:
1、multipart/form-data的基礎方法是post,也就是說是由post方法來組合實現的
2、multipart/form-data與post方法的不同之處:請求頭,請求體。
3、multipart/form-data的請求頭必須包含一個特殊的頭資訊:Content-Type,且其值也必須規定為multipart/form-data,同時還需要規定一個內容分割符用於分割請求體中的多個post的內容,如檔案內容和文字內容自然需要分割開來,不然接收方就無法正常解析和還原這個檔案了。具體的頭資訊如下:
- Content-Type: multipart/form-data; boundary=${bound}
//其中${bound} 是一個佔位符,代表我們規定的分割符,可以自己任意規定,但為了避免和正常文字重複了,儘量要使用複雜一點的內容。如:--------------------56423498738365
4、multipart/form-data的請求體也是一個字串,不過和post的請求體不同的是它的構造方式,post是簡單的name=value值連線,而multipart/form-data則是添加了分隔符等內容的構造體。具體格式如下:
-
--${bound}
- Content-Disposition: form-data; name="Filename"
- HTTP.pdf
- --${bound}
- Content-Disposition: form-data; name="file000"; filename="HTTP協議詳解.pdf"
- Content-Type: application/octet-stream
- %PDF-1.5
- file content
- %%EOF
- --${bound}
- Content-Disposition: form-data; name="Upload"
- Submit Query
- --${bound}--
綜上,可以知道要傳送一個multipart/form-data的請求,其實任何支援post請求的工具或語言都可以支援,只是自己要稍微包裝一下便可。
參考資料:
百度百科: http://baike.baidu.com/view/9472.htm
http1.1協議規範: http://www.faqs.org/rfcs/rfc2616.html
分析工具:httpAnalyzer