全部,

作为我正在编写的应用程序的一部分,我需要一个 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');

http://us3.php.net/file_get_contents.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top