概述
在POST請求中,理論上請求端程序可以發送任意格式報文正文,但是最好在報文頭Content-Type字段標明正文的格式,方便接收端根據Content-Type正確處理正文。
傳統HTML-form表單提交
html-form表單中,post正文格式被定義在enctype屬性中,該屬性一共定義了3個值,分別對應Content-Type的3個值:
| enctype值 | enctype描述 | 對應Content-Type的值 | 正文段格式示例 |
| application/x-www-form-urlencoded | 在發送前編碼所有字符,http_query編碼方式(默認) | application/x-www-form-urlencoded | manid=qwert&file-a=1ca6f20fd0c29742bec9914423140d03.jpg |
| multipart/form-data | 不對字符編碼,正文內容是每一個表單字段進行boundary分隔組成的報文,支持二進制數據提交 | multipart/form-data; boundary=XXXXXXXXXX(請求端程序自行生成的boundary) | ------WebKitFormBoundaryNOdBuEzJYqyffk3l Content-Disposition: form-data; name="manid" qwert ------WebKitFormBoundaryNOdBuEzJYqyffk3l Content-Disposition: form-data; name="file-a"; filename="1ca6f20fd0c29742bec9914423140d03.jpg" Content-Type: image/jpeg #¥%%……&%F……% ------WebKitFormBoundaryNOdBuEzJYqyffk3l-- |
| text/plain | 空格轉換為 "+" 加號,但不對特殊字符編碼 | text/plain | manid=qwert file-a=1ca6f20fd0c29742bec9914423140d03.jpg |
只有enctype="multipart/form-data"能夠提交form input type="file"字段選擇的文件,其余兩種編碼方式只能夠提交文件名。
自定義提交
發送端只需要遵循HTTP報文規范,就可以自行自定義發送post報文,這跟是否帶有Content-Type無關,但是接收端也要自定義解析規則,如果是通用的解析規則,通常只能支持規范中的Content-Type類型解析。
PHP
PHP自帶的報文解析只支持html form enctype原生的前2種解析方式("application/x-www-form-urlencoded","multipart/form-data"),通常字符類型的字段解析到全局變量$_POST中,二進制內容解析到全局變量$_FILES中。
也可以運用自帶封裝協議"php://input"讀取請求正文,但是當enctype="multipart/form-data"的情況下,這種方式是無效的,其余情況,包括自定義的Content-Type值,都可以讀取。
