我正在尝试使用HTTP PUT上传文件。
看了一下后,似乎$_FILES
数组只有POST和multipart/form-data
。 使用PUT时,我需要手动读取php://input
以获取数据。 两种方法都不起作用。
我尝试了以下选项,并感谢您提供的任何提示:
curl --upload avatar.jpg http://api.test.com/user/dsadasdsa
curl -X PUT -F "[email protected]" http://api.test.com/user/dsadasdsa
我的PHP文件试图打印这个但返回一个空字符串:
echo file_get_contents("php://input");
我开始认为这可能是一个Nginx问题,缺少PUT DELETE支持并安装了nginx-extras以及将以下内容添加到我的nginx配置中但不幸的是这也无济于事。
root /var/www/;
dav_methods PUT DELETE MKCOL COPY MOVE;
create_full_put_path on;
dav_access group:rw all:r;
我有一些调试的想法。
做一个var_dump(file_get_contents('php://input'));
而不是回声。 据参考 :
此函数可能返回布尔值FALSE,但也可能返回非布尔值,其值为FALSE。 有关更多信息,请阅读有关布尔值的部分。 使用===运算符测试此函数的返回值。
如果你得到一个bool(false)
作为输出,那就有一些错误会导致你无法读取php://input
- 很可能是一个PHP问题。 如果你得到string(0) ""
,那么在php://input
没有任何东西(不再是?),这使得它更有可能是一个nginx问题。
另外,根据php://
引用 ,你不能使用带有enctype="multipart/form-data"
php://input
。 你确定你不使用那个吗? 如果更熟悉,您也可以尝试HTML文件。
您也可以默认检查错误日志/var/log/nginx/error.log
。 另外,检查HTTP响应代码。 是200吗? 如果没有,这是一个有用的代码吗?
你正在使用的选项-F导致curl使用Content-Type multipart / form-data来POST数据(参见man curl)。
您可以使用--data-binary选项,如:
curl -X PUT --data-binary "@avatar.jpg" http://api.test.com/user/dsadasdsa
-d选项仅适用于文本,可能会损坏您的数据。
在我的测试中,以下命令给出了相同的结果。
curl --upload "avatar.jpg" http://api.test.com/user/dsadasdsa
这是我的服务器
<?php
echo "request method : " . $_SERVER['REQUEST_METHOD'] . "\n";
echo "dump files ";
var_dump($_FILES);
$putdata = fopen("php://input", "r");
while ($data = fread($putdata, 1024)) {
echo $data . "\n";
}
?>
Nginx支持所有http动词(put,delete,options等)。 因此,您不需要在nginx中进行任何特殊设置。
以下工作(我使用php5.4服务器轻松测试这个):
添加这个简单的测试php脚本put.php
$putdata = fopen("php://input", "r");
while ($data = fread($putdata, 1024)) {
echo $data . "\n";
}
从put.php的同一文件夹启动php服务器:
php -S localhost:5000
发出PUT卷曲请求:
curl -d "@/path/to/put.php" -X PUT http://localhost:5000/put.php
这将打印put.php的文件内容
[ 更新 ]
如果你想使用php向一个宁静的api网站发送一个curl请求,我会推荐Guzzle ,你不必记住所有这些curl选项。
如果您尝试向服务器创建PUT请求而无法从php包装器中读取,请确保:
你有正确的PUT请求。 完成标题和填充( 使用PHP和CURL发出PUT请求 )
您的服务器接受PUT请求。
你的php文件可以先读取简单的PUT请求(没有上传部分)
您可能还想查看php:// input( http://php.net/manual/en/wrappers.php.php )中指示的“注释”。 除此之外,它可能是服务器上的问题。
两种方法都不起作用
我从来没有尝试用PHP实现DAV,但我可以向你保证,即使使用nginx,带文件上传的POST也能正常工作。
curl --upload avatar.jpg http://api.test.com/user/dsadasdsa
我希望这可以工作 - 你的日志显示什么? 你试过'--trace'了吗?
curl -X PUT -F“[email protected]” http://api.test.com/user/dsadasdsa
将-F标志与curl一起使用意味着使用multipart / form-data编码将文件作为POST变量上传 - 这对PUT请求没有任何意义。
您是否通过在nginx后面放置一种不同类型的webapp并测试它是否可以处理PUT上传来消除PHP作为问题的原因? 一个非常简短的Python Flask应用程序将让您以另一种语言测试PUT上传。