2013-02-12 14 views
1

我正在研究一個包含小型REST API的應用程序。其中一種方法需要在PUT請求上接受大量(近300MB)的二進制文件上傳。CakePHP 2.x - 直接訪問php://直接處理大請求正文

由於該文件非常大,並且由於存在一些此類請求一次運行的風險,因此我想避免將整個請求主體放在內存中。我曾希望通過直接從php://input流中讀取並將其吸引到文件中來實現此目的。

但是,控制器的input()方法似乎是干擾性的。我瞭解input()的基本原理 - 只要您閱讀php://input數據流,它就消失了,因此input()就可以保留它以便重複訪問。顯然,這是我希望在這種情況下繞過的行爲。

看來,雖然,input()被稱爲地方我控制器代碼運行之前,因爲當我到php://input,什麼都不剩閱讀。

所以,我的問題:有沒有一種方法讓CakePHP控制器能夠將一個非常大的請求體傳輸到磁盤上,而無需首先將整個內容加載到內存中?

回答

0

我想通了,所以我希望以下幾點能夠幫助別人節省一些時間。

原來,這是我的錯誤,但沒有一個與CakePHP有關。如果您從您的控制器讀取php://input而未調用Controller::input(),您將(正常情況下)按照您的預期獲取原始請求主體。

我的問題是我無意中設置了請求標頭Content-Type: application/json。這導致CakePHP的REST代碼嘗試將身體解析爲輸入。當我正確設置類型(在我的例子application/x-gzip),一切正常。