Получать исходные данные

Согласно 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 ?

Solutions Collecting From Web of "Получать исходные данные"

Прямой ответ: вы не можете этого сделать. 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 могут быть более легкими.