通过file upload到PHP来curlPUT请求

我正在尝试使用HTTP PUT上传文件。
看了一下后,似乎$_FILES数组只有POST和multipart/form-data 。 而使用PUT时,我需要手动读取php://input来获取数据。 两种方法都不起作用。

我尝试了以下选项,并希望您可能有任何提示:

 curl --upload avatar.jpg http://api.test.com/user/dsadasdsa curl -X PUT -F "filedata=@avatar.jpg" http://api.test.com/user/dsadasdsa 

我的PHP文件试图打印这个,但返回一个空string:

 echo file_get_contents("php://input"); 

我开始认为这可能是一个缺lessPUT DELETE支持的Nginx问题,并且安装了nginx-extras以及将以下内容添加到了我的nginxconfiguration中,但是这不起作用。

 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会使用Content-Type multipart / form-data(请参见man curl)使curl引发POST数据。

您可以使用–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发送一个curl请求到一个平静的API网站,我会推荐Guzzle ,你不必记住所有这些卷曲选项。

如果你正在尝试创建一个PUT请求到服务器,并且不能从php包装器中读取,请确保:

  1. 你有正确的PUT请求。 完成标题和东西( 用PHP和CURL做一个PUT请求 )

  2. 你的服务器接受PUT请求。

  3. 你的php文件可以先读取简单的PUT请求(没有上传部分)

您可能还想查看php:// input( http://php.net/manual/en/wrappers.php.php )中的“注释”。 除此之外,这可能是服务器上的问题。

两种方法都不起作用

我从来没有尝试过使用PHP实现DAV,但我可以向你保证,即使使用nginx,文件上传也是可行的。

curl –upload avatar.jpg http://api.test.com/user/dsadasdsa

我会期待这个工作 – 你的日志显示什么? 你用“ – 跟踪”来试试吗?

curl -X PUT -F“filedata=@avatar.jpg” http://api.test.com/user/dsadasdsa

在curl中使用-F标志意味着使用multipart / form-data编码将文件作为POST变量上传 – 这对于PUT请求没有任何意义。

你有没有把PHP作为问题的原因,把一种不同类型的webapp放在nginx后面,然后测试它是否可以处理PUT上传? 一个非常短的Python Flask应用程序可以让你测试另一种语言的PUT上传。