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

时间:2013-06-09 17:19:07

标签: php curl upload nginx put

我正在尝试使用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文件正在尝试打印此文件,但返回一个空字符串:

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;

6 个答案:

答案 0 :(得分:3)

我有一些调试的想法。

执行var_dump(file_get_contents('php://input'));而不是回声。根据{{​​3}}:

  

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

如果输出bool(false),则会出现错误,导致您无法阅读php://input - 很可能是PHP问题。如果你得到string(0) "",那么php://input中就没有了(不再是?),这使得这更像是一个nginx问题。

此外,根据reference,您无法将php://inputenctype="multipart/form-data"一起使用。你确定你不使用那个吗?如果更熟悉,您也可以尝试HTML文件。

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

答案 1 :(得分:2)

你正在使用的选项-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";
}
?>

答案 2 :(得分:1)

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卷曲请求:

curl -d "@/path/to/put.php" -X PUT http://localhost:5000/put.php

这将打印put.php的文件内容

[<强>更新

如果你想使用php向一个安静的api网站发送一个curl请求,我建议Guzzle,你不必记住所有这些curl选项。

答案 3 :(得分:0)

如果您尝试向服务器创建PUT请求但无法从php包装器中读取,请确保:

  1. 您有正确的PUT请求。完成标题和内容(Making a PUT request with PHP and CURL

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

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

  4. 您可能还想查看注意事项&#39;在php:// input(http://php.net/manual/en/wrappers.php.php)中指出。除此之外,它可能是服务器上的一个问题。

答案 4 :(得分:0)

  

两种方法都不起作用

我从来没有尝试用PHP实现DAV,但我可以向你保证,即使使用nginx,文件上传的POST也能正常工作。

  

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

我原本预计这会有效 - 你的日志显示了什么?你试过'--trace'吗?

  

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

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

答案 5 :(得分:0)

你是否已经通过在nginx后面添加一种不同类型的webapp来消除PHP作为问题的原因,并测试它是否可以处理PUT上传?一个非常简短的Python Flask应用程序将允许您用另一种语言测试PUT上传。