CakePHP 2.x — прямой доступ к php://input для работы с большим телом запроса

Я работаю над приложением, которое включает небольшой REST API. Один из этих методов должен принимать большой (почти 300 МБ) двоичный файл, загружаемый по запросу PUT.

Поскольку файл довольно большой и существует некоторый риск одновременного выполнения нескольких таких запросов, я бы хотел избежать хранения всего тела запроса в памяти. Я надеялся сделать это, прочитав поток php://input напрямую и перекачав его в файл.

Однако метод input() контроллера, похоже, мешает. Я понимаю смысл input() — как только вы читаете поток php://input, он исчезает, поэтому input() удерживает его для повторного доступа. Очевидно, это поведение, которое я хочу обойти в данном случае.

Однако кажется, что input() вызывается где-то до запуска кода моего контроллера, потому что к тому времени, когда я добираюсь до php://input, читать уже нечего.

Итак, мой вопрос: есть ли способ для контроллера CakePHP передавать очень большое тело запроса на диск без предварительной загрузки всего этого в память?


person eaj    schedule 12.02.2013    source источник


Ответы (1)


Я понял это, поэтому я надеюсь, что следующее сэкономит кому-то время.

Это оказалось ошибкой с моей стороны, но не связанной с CakePHP. Если вы читаете php://input из своего контроллера, не вызывая Controller::input(), вы (обычно) получаете необработанное тело запроса, как и ожидали.

Моя проблема заключалась в том, что я непреднамеренно установил заголовок запроса Content-Type: application/json. Это заставило код REST CakePHP попытаться проанализировать тело в качестве входных данных. Когда я правильно установил тип (в моем случае application/x-gzip), все работало правильно.

person eaj    schedule 22.02.2013