【问题标题】:(CURL, PHP) Uploading files with PUT request, How do I process this?(CURL, PHP) 使用 PUT 请求上传文件,我该如何处理?
【发布时间】:2013-02-27 07:57:19
【问题描述】:

这就是我在 process.php 中的内容

parse_str(file_get_contents("php://input"),$upload_data);
if (isset($upload_data)) {
   print_r($upload_data);
   exit;
}

这就是我使用 curl 查询服务器的方式。

weldan@prindu:~$ curl -X PUT -H "X-TOKEN: test123" -F filedata=@/home/weldan/Pictures/Cool-Pictures1.jpg  http://host.tld/process.php
Array
(
    [------------------------------22031b6e799c
Content-Disposition:_form-data;_name] => "filedata"; filename="Cool-Pictures1.jpg"
Content-Type: image/jpeg

���
)

这样我怎么知道那里有上传的文件。

当前的问题是,我该如何处理这个文件,比如 $_FILES 变量?

也开放其他方式来实现这一点。

谢谢

【问题讨论】:

    标签: php curl upload put


    【解决方案1】:

    PUT 请求中填充的 $_FILES 数组。这是因为 PUT 请求会在 url 中指定文件名,在正文中指定文件内容。仅此而已。

    您必须按照您的建议使用php://input

    上传.php

    <?php
    /* PUT data goes to php://input */
    echo file_get_contents("php://input");
    

    然后使用以下 curl 命令行:

    curl --upload -H "X-TOKEN: test123" a.txt  http://localhost/upload.php
    

    cmets 后更新:使用 --upload 选项应该满足您的需要。与 -X PUT 和 -F 不同的是,数据将被原始发送并得到 not multipart/form-data 编码.. curl 的隐藏宝藏之一 ;)

    【讨论】:

    • 这就是它的样子:------------------------------7bb0791da128 Content-Disposition: form-data; name="filedata"; filename="test.txt" Content-Type: text/plain test 123 ------------------------------7bb0791da128-- 也许这就是无法查看上传的图像文件的原因。它有额外的字符串。
    • 是的 :) 我在测试中意识到了这一点 :) 但重要的是第一句话。它更多地是关于 HTTP 协议的性质而不是 php 问题。对于 PUT 请求,只能有一个文件,因此没有 $_FILES 数组。 进一步注意 -F 参数周围的双引号。没有它们就行不通
    • 是的。按照建议做了。我认为我们在服务器端得到的仍然是原始二进制数据。如果我将它存储为 filename.txt 我仍然看到额外的字符串,我想要做的是..我想将数据存储在临时文件中,以便我可以检查它的类型,在我的情况下我想要图像文件。所以你的回答实际上很有帮助,但没有解决问题。还在想怎么办。谢谢
    • @WeldanJamili 欢迎您。注意.. 毕竟,我认为 PHP 开发人员在决定不在 PUT 请求上填充 $_FILES 数组时是正确的。但我不确定这是一个明智的决定,还是他们只是忘记了.. :)
    【解决方案2】:

    简答

    在您的情况下,唯一的方法是手动解析原始请求(查看this gist

    想法

    • PUT 请求只能用于上传一个文件(不是来自 html 上传表单,而是使用自定义请求)。在服务器上,您只需获取原始文件内容并将其写入某个文件。
    • 使用不带文件的 PUT (application/x-www-form-urlencoded) 并使用 parse_str(file_get_contents("php://input"), $_PUT); 解析原始请求
    • 使用 POST 上传文件(多部分/表单数据)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多