關於file_get_contents("php://input")

初見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&amp;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’)就能獲取到圖片流,然後把圖片流保存到一個文件,這個文件就是圖片了

發佈了22 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章