CakePHP 2.x - Akses php://input secara langsung untuk menangani badan permintaan besar

Saya sedang mengerjakan aplikasi yang menyertakan REST API kecil. Salah satu metode ini perlu menerima unggahan file biner berukuran besar (hampir 300MB) pada permintaan PUT.

Karena filenya cukup besar, dan karena ada risiko beberapa permintaan berjalan sekaligus, saya ingin menghindari menyimpan seluruh isi permintaan di memori. Saya berharap melakukan ini dengan membaca langsung dari aliran php://input dan menyedotnya ke sebuah file.

Namun, metode input() pengontrol tampaknya mengganggu. Saya memahami alasan input()—setelah Anda membaca aliran php://input, aliran itu hilang, jadi input() menyimpannya untuk akses berulang. Jelas sekali, ini adalah perilaku yang ingin saya lewati dalam hal ini.

Namun tampaknya input() dipanggil di suatu tempat sebelum kode pengontrol saya dijalankan, karena saat saya mencapai php://input, tidak ada lagi yang perlu dibaca.

Jadi, pertanyaan saya: Apakah ada cara bagi pengontrol CakePHP untuk mengalirkan isi permintaan yang sangat besar ke disk tanpa terlebih dahulu memuat semuanya ke dalam memori?


person eaj    schedule 12.02.2013    source sumber


Jawaban (1)


Saya sudah menemukan jawabannya, jadi saya harap yang berikut ini akan menghemat waktu orang lain.

Ini ternyata kesalahan saya, tapi tidak terkait dengan CakePHP. Jika Anda membaca php://input dari pengontrol Anda tanpa memanggil Controller::input(), Anda (biasanya) akan mendapatkan isi permintaan mentah seperti yang Anda harapkan.

Masalah saya adalah saya secara tidak sengaja menyetel header permintaan Content-Type: application/json. Hal ini menyebabkan kode REST CakePHP mencoba mengurai isi sebagai masukan. Ketika saya mengatur jenisnya dengan benar (dalam kasus saya application/x-gzip) semuanya berfungsi dengan benar.

person eaj    schedule 22.02.2013