初見file_get_contents("php://input") ,給我第一感覺就是 還有這樣寫法?好吧 真有
“php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”.
翻譯過來,是這樣:
“php://input可以讀取沒有處理過的POST數據。相較於$HTTP_RAW_POST_DATA而言,它給內存帶來的壓力較小,並且不需要特殊的php.ini設置。php://input不能用於enctype=multipart/form-data”
找了一通資料,原來是這麼回事:
1,Coentent-Type僅在取值爲application/x-www-data-urlencoded和multipart/form-data兩種情況下,
PHP纔會將http請求數據包中相應的數據填入全局變量$_POST
2,PHP不能識別的Content-Type類型的時候,會將http請求包中相應的數據填入變量$HTTP_RAW_POST_DATA
3, 只有Coentent-Type不爲multipart/form-data的時候,PHP不會將http請求數據包中的相應數據填入php://input,
否則其它情況都會。填入的長度,由Coentent-Length指定。
4,只有Content-Type爲application/x-www-data-urlencoded時,php://input數據纔跟$_POST數據相一致。
5,php://input數據總是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更湊效,
且不需要特殊設置php.ini
6,PHP會將PATH字段的query_path部分,填入全局變量$_GET。通常情況下,GET方法提交的http請求,body爲空。
【轉】
從官網信息來看,php://input是一個只讀信息流,當請求方式是post的,並且enctype不等於”multipart/form-data”時,可以使用php://input來獲取原始請求的數據。
看一個簡單的例子。
客戶端就是一個表單,非常簡單。
1 |
< form action = "" method = "POST" > |
2 |
name:
< input type = "text" name = "name" value = "tom" />< br /> |
3 |
age:< input type = "text" name = "age" value = "22" />< br /> |
4 |
< input type = "submit" value = "Submit" /> |
5 |
</ form > |
將表單提交到服務端,服務端使用file_get_contents獲取php://input內容
1 |
$content = file_get_contents ( "php://input" ); |
2 |
echo $content ; //輸出name=tom&age=22 |
官網關於php://input的說明中,反覆有提到$HTTP_RAW_POST_DATA這個變量,這個變量其實和file_get_contents(php://input)的內容是一樣的。如果要開啓這個變量,需要修改配置文件,找到always_populate_raw_post_data這個選項,設置爲On,然後重新啓動web服務器,就可以了。而使用php://input不需要修改php配置文件。
在項目應用中,如攝像頭拍照,上傳保存,就可以用到php://input。客戶端拍照後,把圖片流傳送到服務端,服務端使用file_get_getcontents(‘php://input’)就能獲取到圖片流,然後把圖片流保存到一個文件,這個文件就是圖片了