无法访问 Web 服务代码中的 HTTP PUT 数据
-
02-07-2019 - |
题
全部,
作为我正在编写的应用程序的一部分,我需要一个 HTTP PUT Web 服务来接受传入的图像数据,这些数据将被分析、验证并添加到本地文件存储中。
我的问题是在尺寸验证后出现的
$_SERVER['CONTENT_LENGTH']
具有 > 0 值,并且该值与测试文件大小相同,因此我可以假设到目前为止一切进展顺利 但 当我尝试使用读取传入流数据时
file_get_contents('php://stdin');
我得到一个空字符串。我也尝试过使用
file_get_contents('php://input');
这给了我相同的空字符串结果。
任何帮助、建议或指导将不胜感激。
注意:我在用着
- PHP 5.2.6
- 阿帕奇2.0
解决方案
我最好的猜测是您需要更改 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>
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')
(并且file, fopen+fread
)不返回邮政数据,当以enctype =“ Multipart/form-data”提交表单时。当提交相同的表单未指定的相同表单时(使用默认的“ application/x-www-form-urlencoded”)所有)都可以正常工作。
所以看起来解决方法是将指定的形式 enctype 更改为 multipart/form-data
, ,这显然不适合图像上传 - 来自 W3 FORM规格:
内容类型“application/x-www-form-urlencoded”对于发送大量二进制数据或包含非 ASCII 字符的文本效率很低。内容类型“multipart/form-data”应用于提交包含文件、非 ASCII 数据和二进制数据的表单。
进一步编辑
这个错误似乎已在您的 PHP 版本中得到解决。您是否检查过以确保读入的缓冲区不以回车/换行符开头?讨论了一个与您的问题有些相似的问题 在站点点上.
尝试跑步 strlen
在输入上查看长度是多少。
这 r
你已经得到了,因为第二个参数不正确。 file_get_contents
不使用 a/r/w/a+/r+/w+
论点 fopen
用途。您可能想删除它,然后执行以下操作:
file_get_contents('php://input');