2018/06/07 HTTP 中 Content-Type 的作用
在此之前先看一個小例子:
<?php var_dump($_FILES);?> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Page Title</title> </head> <body> <form action="" method="POST"> <input type="file" name="file"> <input type="$_FILES 會獲取到值麽?submit" value="submit"> </form> </body> </html>
如果不是很清楚或者覺得可以獲取到,那麽可以接著看看。
本文部分圖片和段落節選,原文為:理解HTTP之Content-Type
感謝。
Content-Type 是什麽?
通俗理解的的話,它就是我們規定發送數據包的一種格式,就像我們寄快遞一樣。不同的包裝公司 (Content-Type) 有不同的包裝方式。
接受方也會根據這個值來進行下一步操作。
這也就是說明了我們上面的那個小例子中。$_FILES 變量中為什麽獲取不到值。
表單發送(未指定 Content-Type 使用默認),$_FILES 不認識默認的 Content-Type ,拒收,所以才會產生獲取不到的情況
Content-Type 作用?
Content-Type用於指定內容類型,一般是指網頁中存在的Content-Type,Content-Type屬性指定請求和響應的HTTP內容類型。如果未指定 ContentType,默認為text/html。
在nginx中有個配置文件mime.types
,主要是標示Content-Type的文件格式。
下面是幾個常見的Content-Type:
1.text/html
2.text/plain
3.text/css
4.text/javascript
5.application/x-www-form-urlencoded
6.multipart/form-data
7.application/json
8.application/xml
...
前面幾個都很好理解,都是html,css,javascript的文件類型,後面四個是POST的發包方式。
下面講講他們具體的格式問題
Content-Type 的格式?
1:application/x-www-form-urlencoded
application/x-www-form-urlencoded
是常用的表單發包方式,普通的表單提交,或者js發包,默認都是通過這種方式,
2:multipart/form-data
multipart/form-data
用在發送文件的POST包。
這裏Content-Type
告訴我們,發包是以multipart/form-data
格式來傳輸,另外,還有boundary
用於分割數據。
當文件太長,HTTP無法在一個包之內發送完畢,就需要分割數據,分割成一個一個chunk發送給服務端,
3:application/json
通過json形式將數據發送給服務器,一開始,我嘗試通過curl,給服務器發送application/json
格式包,
4:text/xml
通過xml 形式將數據發送給服務器
總結:
發現了麽。
php中$_POST
只能讀取application/x-www-form-urlencoded
數據,$_FILES
只能讀取multipart/form-data
類型數據.
具體為什麽,就因該想一下這這兩種發送的不同。
對於其他格式的傳輸,應該怎麽取呢?
那麽,要讀取text/xml格式的數據,可以用: $file = fopen(‘php://input’, ‘rb’); $data = fread($file, length); fclose($file); 或者 $data = file_get_contents(‘php://input’);
對於其他格式傳輸,取得,其實都是一種文件流一樣的。
之後按照規則去轉碼。
2018/06/07 HTTP 中 Content-Type 的作用