Получать исходные данные
В соответствии с php manual или php://не вводит ни $HTTP_RAW_POST_DATA
работу с multipart/form-data
POST-запросами.
"php://позволяет вам читать необработанные POST-данные. Это менее интенсивно использующая память альтернатива $HTTP_RAW_POST_DATA
и не нуждается в каких-либо специальных директивах php.ini. Вход php://недоступен с помощью enctype="multipart/form-data"
".
Как я могу получить необработанные данные для форм multipart/form-data
?
Ответы
Ответ 1
Прямой ответ: вы не можете этого сделать. PHP настаивает на его разборе, всякий раз, когда он видит Content-Type 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://и самостоятельно проанализировать.
Это некрасиво, но я не нашел лучшего или фактически другого решения - не попросив партнера исправить свою сторону.
NB! Когда вы сделаете то, что я описал здесь, $_FILES будет пустым.
Ответ 2
Вы можете установить enable_post_data_reading = Off
, а PHP не будет перехватывать данные multipart/form-data
.
Требуется: PHP 5.4
Ответ 3
Я не реализовал это полностью, но похоже, что он должен работать. В 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 для большей части этого!:)
EDIT: P.S. Очевидно, что это Apache-специфический, но в некоторых других конфигурациях PHP могут быть очень легкие способы.