Получить необработанные данные - PullRequest
30 голосов
/ 01 сентября 2009

В соответствии с инструкциями php и php: // ввод ни $HTTP_RAW_POST_DATA не работает с multipart/form-data POST-запросами.

"php: // input позволяет вам читать необработанные POST-данные. Это менее ресурсоемкая альтернатива $HTTP_RAW_POST_DATA и не требует каких-либо специальных директив php.ini. Php: // input недоступен с enctype="multipart/form-data" ".

Как я могу получить необработанные данные для multipart/form-data форм?

Ответы [ 3 ]

36 голосов
/ 01 сентября 2009

Прямой ответ: вы не можете этого сделать. PHP настаивает на том, чтобы анализировать его сам, всякий раз, когда он видит тип содержимого multipart / form-data. Необработанные данные не будут вам доступны. К сожалению. Но вы можете взломать его.

Я столкнулся с подобной проблемой: партнер отправлял неправильно отформатированные данные как multipart / form-data, PHP не мог их проанализировать и не выдавал их, поэтому я мог разобрать их сам.

Решение? Я добавил это в свой apache conf:

<Location "/backend/XXX.php">
    SetEnvIf Content-Type ^(multipart/form-data)(.*) NEW_CONTENT_TYPE=multipart/form-data-alternate$2 OLD_CONTENT_TYPE=$1$2
    RequestHeader set Content-Type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE
</Location> 

Это изменит входящий запрос Content-Type на XXX.php с multipart / form-data на multipart / form-data-alternate, что достаточно, чтобы запретить PHP пытаться его проанализировать

После этого вы можете, наконец, прочитать исходные данные из php: // input и проанализировать их самостоятельно.

Это некрасиво, но я не нашел лучшего или какого-либо другого решения, кроме как попросить партнера исправить свою сторону.

NB! Когда вы сделаете то, что я описал здесь, $ _FILES будет пустым.

11 голосов
/ 31 октября 2013

Вы можете установить enable_post_data_reading = Off, и PHP не будет перехватывать multipart/form-data данные.

Требуется: PHP 5.4

5 голосов
/ 14 июня 2012

Я не реализовал это полностью, но похоже, что это должно работать. В Apache conf:

SetEnvIf Content-Type ^(multipart/form-data)(.*) MULTIPART_CTYPE=$1$2
RequestHeader set Content-Type application/x-httpd-php env=MULTIPART_CTYPE
RequestHeader set X-Real-Content-Type %{MULTIPART_CTYPE}e env=MULTIPART_CTYPE

Установка Content-Type на application/x-httpd-php, кажется, решает исходную проблему синтаксического анализа тела PHP, и проблема Норберт Фаркас сообщил: «Apache отправляет исходный код PHP» . В этом случае тело доступно для php://input, а реальный тип содержимого - в заголовке X-Real-Content-Type. (Этот заголовок может вам не понадобиться - переменная MULTIPART_CTYPE, похоже, не отображается в моем $_ENV, но новый заголовок появился.) Все остальные запросы должны обрабатываться как обычно.

Спасибо Anti Veeranna за большую часть! :)

РЕДАКТИРОВАТЬ: P.S. Очевидно, это зависит от Apache, но в некоторых других конфигурациях PHP вполне могут быть более простые способы.

...