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

时间:2008-09-28 13:41:25

标签: php web-services rest

所有

作为我正在编写的应用程序的一部分,我需要有一个HTTP PUT Web服务,它接受传入的imagedata,它将通过分析,验证并添加到本地文件存储。

我的问题在大小验证后出现

  

$_SERVER['CONTENT_LENGTH']

有一个> 0值,这个值与测试文件大小相同,所以我可以假设当我尝试使用

读取传入的流数据时,所有这一切都很顺利但是
  

file_get_contents('php://stdin');

我得到一个空字符串。我也尝试过使用

  

file_get_contents('php://input');

这给了我一个空字符串的相同结果。

任何帮助,建议或指示都将不胜感激。

注意:我正在使用

  • PHP 5.2.6
  • Apache 2.0

4 个答案:

答案 0 :(得分:2)

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>

答案 1 :(得分:1)

我最好的猜测是你需要改变httpd.conf以拒绝PUT请求。你检查过了吗?

答案 2 :(得分:0)

你得到的r作为第二个arg是不对的。 file_get_contents不使用a/r/w/a+/r+/w+使用的fopen个参数。你可能想要删除它,然后执行:

file_get_contents('php://input');

请参阅http://us3.php.net/file_get_contents

答案 3 :(得分:0)

file_get_contents不接受“r”参数 - 请参阅the PHP manual page

string file_get_contents  ( string $filename  [, int $flags...)

有效$flag值为FILE_USE_INCLUDE_PATH, FILE_TEXT, FILE_BINARY

尝试删除“r”标志并再次尝试

编辑 - 问题已更新,“r”标志被忽略,显然不是问题的根源。

看起来reported bug in PHP关于file_get_contents返回HTTP POST的空字符串。从错误描述:

  

file_get_contents('php://input')(以及file, fopen+fread)没有   返回POST数据,当提交表单时   ENCTYPE = “多部分/格式数据”。

     

当提交没有指定enctype的相同表单时(默认情况下)   使用“application / x-www-form-urlencoded”)一切正常。

因此,从W3 FORM specification

开始,改变指定的表单enctype远离multipart/form-data,这显然不适合图片上传,这似乎是一种解决方法。
  

内容类型“application / x-www-form-urlencoded”对于发送大量二进制数据或包含非ASCII字符的文本效率不高。内容类型“multipart / form-data”应该用于提交包含文件,非ASCII数据和二进制数据的表单。

进一步修改

此错误似乎已在您的PHP版本中得到解决。您是否已检查以确保正在读入的缓冲区不以car-return /换行符char开头?有一个问题与你的问题有些相似on Sitepoint

尝试在输入上运行strlen,看看长度是多少。