将文件上传到PHP的Curl PUT请求

将文件上传到PHP的Curl PUT请求,php,curl,upload,nginx,put,Php,Curl,Upload,Nginx,Put,我正在尝试使用HTTP PUT上载文件。 读了一点之后,似乎$\u文件数组只包含POST和多部分/表单数据。使用PUT时,我需要手动读取php://input获取数据。两种方法都不起作用 我尝试了以下选项,如果您有任何建议,我将不胜感激: curl——上传avatar.jpghttp://api.test.com/user/dsadasdsa curl-X PUT-F“filedata=@avatar.jpg”http://api.test.com/user/dsadasdsa 我的PHP文件

我正在尝试使用HTTP PUT上载文件。
读了一点之后,似乎
$\u文件
数组只包含POST和
多部分/表单数据
。使用PUT时,我需要手动读取
php://input
获取数据。两种方法都不起作用

我尝试了以下选项,如果您有任何建议,我将不胜感激:

curl——上传avatar.jpghttp://api.test.com/user/dsadasdsa
curl-X PUT-F“filedata=@avatar.jpg”http://api.test.com/user/dsadasdsa
我的PHP文件正在尝试打印此内容,但返回一个空字符串:

echo文件获取内容(“php://input");
我开始认为这可能是一个Nginx问题,缺少PUT DELETE支持,安装了Nginx extras,并将以下内容添加到我的Nginx配置中,但不幸的是,这也没有帮助

root/var/www/;
dav_方法放入删除MKCOL复制移动;
创建完整路径;
dav_访问组:rw all:r;

我对调试有一些想法

执行
var\u转储(文件获取内容('php://input'));而不是回音。根据报告:

此函数可能返回布尔值FALSE,但也可能返回计算结果为FALSE的非布尔值。有关更多信息,请阅读布尔值部分。使用===运算符测试此函数的返回值

如果您得到一个
bool(false)
作为输出,则会出现一些错误,使您无法读取
php://input
-很可能是PHP问题。如果您得到
string(0)“
,则
php://input
(还有?),这使得这更可能是nginx的问题

此外,根据,您不能使用
php://input
带有
enctype=“多部分/表单数据”
。你确定你不用那个吗?如果你更熟悉HTML文件,你也可以试试


您还可以检查错误日志,默认情况下为
/var/log/nginx/error.log
。另外,请检查HTTP响应代码。是200吗?如果不是,这是一个有用的代码吗?

Nginx支持所有http动词(put、delete、options等)。因此,您不需要在nginx中进行任何特殊设置

以下工作(我正在使用php5.4服务器轻松测试此功能):

添加这个名为put.php的简单测试php脚本

$putdata = fopen("php://input", "r");
while ($data = fread($putdata, 1024)) {
      echo $data . "\n";
}
从put.php的同一文件夹启动php服务器:

php -S localhost:5000
发出PUT CULL请求:

curl -d "@/path/to/put.php" -X PUT http://localhost:5000/put.php
这将打印put.php的文件内容

[更新]


如果您想使用php向restful api站点发送curl请求,我建议您不要记住所有这些curl选项。

您使用的选项-F会导致curl使用内容类型multipart/form data发布数据(请参阅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";
}
?>

如果您试图创建对服务器的PUT请求,但无法读取php包装,请确保:

  • 你有权提出请求。完成标题和内容()

  • 您的服务器接受PUT请求

  • 您的php文件可以先读取简单的PUT请求(无需上载部分)

  • 您可能还想查看php://input (). 除此之外,这可能是服务器上的问题

    两种方法都不起作用

    我从未尝试过用PHP实现DAV,但我可以向您保证,即使使用nginx,POST和文件上传也可以工作

    curl——上传avatar.jpg

    我本以为这会奏效——你的日志显示了什么?你试过用“--trace”吗

    curl-X PUT-F“filedata=@avatar.jpg”


    将-F标志与curl一起使用意味着将文件作为POST变量上载,使用多部分/表单数据编码,这对PUT请求没有任何意义。

    您是否通过在nginx后面放置不同类型的webapp,并测试它是否可以处理PUT上载,从而消除了导致问题的PHP?一个很短的Python Flask应用程序可以让你用另一种语言测试上传的内容。

    reference@Gordon-谢谢。我知道这个页面,但它只告诉我在PHP端应该做什么(我已经在做了)。并没有告诉我我在卷曲方面做错了什么。而且,试图运行手册中完全相同的代码只会创建一个空文件。所以我很确定我的卷发要求是错误的。请试一试我也是从那里来的。。。我开始认为错误在于Nginx需要特定的安装来支持PUT/DELETE,我将尝试一下。谢谢你的帮助!不幸的是,我还没有机会测试这一点,但你的答案似乎是迄今为止最彻底的。谢谢@ShaiMishali如果您进行了测试,请告诉我。谢谢你的代表:)