Согласно php manual или php: // вводятся не $HTTP_RAW_POST_DATA
работа с POST-запросами multipart/form-data
.
«php: // input позволяет вам читать необработанные POST-данные. Это менее интенсивно использующая память альтернатива $HTTP_RAW_POST_DATA
и не нуждается в каких-либо специальных директивах php.ini. php: // вход не доступен с enctype="multipart/form-data"
."
Как я могу получить необработанные данные для multipart/form-data
?
Прямой ответ: вы не можете этого сделать. 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 будет пустым.
Вы можете установить enable_post_data_reading = Off
и PHP не будет перехватывать данные multipart/form-data
data.
Требуется: PHP 5.4
Я не реализовал это полностью, но похоже, что он должен работать. В 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: PS Очевидно, что это зависит от Apache, но в некоторых других конфигурациях PHP могут быть более легкими.