获取原始的发布数据
根据PHP手册和PHP: multipart/form-data
input既不$HTTP_RAW_POST_DATA
与multipart/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_CTYPE
variables似乎没有出现在我的$_ENV
,但是新的头文件却没有。)所有其他请求都应该照常处理。
感谢大多数反Veeranna ! 🙂
编辑:PS显然它是Apache特定的,但在PHP的其他configuration中的一些可能更容易的方法。