获取原始的发布数据

根据PHP手册和PHP: multipart/form-datainput既不$HTTP_RAW_POST_DATAmultipart/form-data POST请求。

“php:// input允许你读取原始的POST数据,这是一个内存密集型的替代$HTTP_RAW_POST_DATA ,不需要任何特殊的php.ini指令。 enctype="multipart/form-data"

如何获取multipart/form-data表单的原始数据?

直接回答:你不能那样做。 只要看到multipart / form-data Content-Type,PHP就坚持自己parsing它。 原始数据将不会提供给您。 可悲的是。 但是你可以绕过它。

我遇到了类似的问题,一个合作伙伴发送格式不正确的数据作为multipart / form-data,PHP无法parsing它,并没有给出它,所以我可以自己parsing。

解决scheme? 我把这个添加到我的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> 

这将改变input请求的内容types到XXX.php从multipart / form-data到multipart / form-data-alternate,这足以阻止PHP试图parsing它

在这之后,您可以最终从php://input中读取所有原始数据并自行parsing。

这是丑陋的,但我还没有find一个更好或实际上任何其他的解决scheme – 没有要求伙伴修理他们的一面。

NB! 当你做我在这里描述的$ _FILES将是空的。

您可以设置enable_post_data_reading = Off并且PHP不会拦截multipart/form-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似乎解决了PHPparsing正文的原始问题,而Norbert Farkas则报道: “Apache发回PHP源代码” 。 然后,可以在php://input使用正文,而在X-Real-Content-Type标题中使用X-Real-Content-Type 。 (这个头文件可能不是你需要的 – MULTIPART_CTYPEvariables似乎没有出现在我的$_ENV ,但是新的头文件却没有。)所有其他请求都应该照常处理。

感谢大多数反Veeranna ! 🙂

编辑:PS显然它是Apache特定的,但在PHP的其他configuration中的一些可能更容易的方法。