无法访问Web服务代码中的HTTP PUT数据
全部,
作为我正在编写的应用程序的一部分,我需要有一个HTTP PUT Web服务,该服务接受传入的图像数据,该数据将经过分析,验证并添加到本地文件存储中。
我的问题出现在尺寸验证后,因为
$_SERVER['CONTENT_LENGTH']
的值> 0,并且该值与测试文件的大小相同,因此我可以假设一切顺利,但是当我尝试使用读取流数据时
file_get_contents('php://stdin');
我得到一个空字符串。我也尝试过使用
file_get_contents('php://input');
这给了我一个空字符串的相同结果。
任何帮助,建议或者指示,将不胜感激。
注意:我正在使用
- PHP 5.2.6
- 阿帕奇2.0
解决方案
我们作为第二个参数获得的r
是不正确的。 file_get_contents
不使用fopen
使用的a / r / w / a + / r + / w +
参数。我们可能要删除它,然后执行以下操作:
file_get_contents('php://input');
参见http://us3.php.net/file_get_contents。
file_get_contents
不带有" r"参数,请参见PHP手册页:
string file_get_contents ( string $filename [, int $flags...)
有效的$ flag值为FILE_USE_INCLUDE_PATH,FILE_TEXT,FILE_BINARY。
尝试删除" r"标志,然后重试
编辑问题已更新," r"标志被忽略,因此显然不是问题的根源。
看来PHP中有一个关于file_get_contents
返回HTTP POST空字符串的错误。从错误描述:
file_get_contents('php://input') (and also file, fopen+fread) does not return POST data, when submited form with enctype="multipart/form-data". When submited the same form without enctype specified (so default "application/x-www-form-urlencoded" is used) all works OK.
因此,似乎一种解决方法是将指定的表单enctype更改为远离" multipart / form-data",这显然不是从W3 FORM规范上传图像的理想选择:
The content type "application/x-www-form-urlencoded" is inefficient for sending large quantities of binary data or text containing non-ASCII characters. The content type "multipart/form-data" should be used for submitting forms that contain files, non-ASCII data, and binary data.
进一步编辑
PHP版本似乎已解决此错误。我们是否检查过以确保读取的缓冲区不是以回车/换行符开头?有一个与我们在Sitepoint上讨论过的问题有些相似的问题。
尝试在输入上运行strlen
,看看长度是多少。
我最好的猜测是,我们需要更改httpd.conf才能不拒绝PUT请求。你检查了吗?
默认情况下,Apache HTTPD拒绝PUT请求。我们可以签出mod_put:
http://perso.ec-lyon.fr/lyonel.vincent/apache/mod_put.html
并将其添加到httpd.conf中:
<Location /upload/dir> EnablePut On AuthType Basic AuthName "Web publishing" AuthUserFile /www/etc/passwd AuthGroupFile /www/etc/group <Limit PUT> require valid-user </Limit> </Location>