1

全部,

作为我正在编写的应用程序的一部分,我需要一个 HTTP PUT 网络服务,它接受传入的图像数据,这些图像数据将通过分析、验证并添加到本地文件存储中。

我的问题是在尺寸验证后出现的

$_SERVER['CONTENT_LENGTH']

具有 > 0 的值,并且该值与测试文件大小相同,因此我可以假设到目前为止一切顺利,但是当我尝试使用读取传入的流数据时

file_get_contents('php://stdin');

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

file_get_contents('php://input');

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

任何帮助、建议或方向将不胜感激。

注意:我正在使用

  • PHP 5.2.6
  • 阿帕奇 2.0
4

4 回答 4

2

默认情况下,Apache HTTPD 拒绝 PUT 请求。您可以查看 mod_put:
http ://perso.ec-lyon.fr/lyonel.vincent/apache/mod_put.html

并将其添加到 httpd.conf:

<位置/上传/目录>
  启用穿上
  AuthType 基本
  AuthName "网络发布"
  AuthUserFile /www/etc/passwd
  AuthGroupFile /www/etc/group
  <限制PUT>
    需要有效用户
  </限制>
</位置>
于 2008-10-04T05:34:35.937 回答
1

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

于 2008-09-30T08:17:04.963 回答
0

r你得到的第二个参数是不正确的 。file_get_contents不使用使用的a/r/w/a+/r+/w+参数fopen。您可能想删除它并执行以下操作:

file_get_contents('php://input');

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

于 2008-09-28T13:48:15.230 回答
0

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" 提交表单时不返回 POST 数据。

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

因此,看起来一种解决方法是将指定的表单 enctype 从 更改为multipart/form-data,这显然不适合图像上传-来自W3 FORM 规范

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

进一步编辑

这个错误似乎已在您的 PHP 版本中得到解决。您是否检查过以确保正在读取的缓冲区不是以回车符/换行符开头的?有一个与您在 Sitepoint 上讨论过的问题有些相似的问题。

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

于 2008-09-28T13:55:21.407 回答