无法访问Web服务代码中的HTTP PUT数据

时间:2020-03-06 14:50:44  来源:igfitidea点击:

全部,

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