【问题标题】:Can't send file as form data using cURL无法使用 cURL 将文件作为表单数据发送
【发布时间】:2015-07-10 20:08:04
【问题描述】:

我正在尝试通过命令行发送 cURL 请求。以下是我的要求

curl -i http://localhost/test/index.php 
-X POST 
-F "name=file.png" 
-F "content=@/var/www/html/test/file.png"

我遇到的问题是文件没有随请求一起发送。名称发送正常,但文件未发送。谁能看看我是否做错了什么?

我已经检查了文件的权限,因为我认为这可能是问题,但它们很好

后端是使用 PHP Slim 框架编写的,我正在做以下$app->request->post('content');

【问题讨论】:

  • 尝试设置内容类型...file.png;type=application/octet-streamimage/png。可能是后端问题。是什么让你说它没有被发送?
  • 您的命令运行良好。您如何尝试在后端读取文件?
  • @Phillip 我已经用更多细节更新了我的答案。因此,当我尝试获取 content POST 变量时,它始终为空
  • 你为什么说 POST 变量?当您上传文件时,您必须处理 $_FILES 变量。
  • 你试过 print_r 还是 var_dump($_FILES)

标签: php curl slim


【解决方案1】:

@Bender,使用符号 @,但要更改您的 PHP 代码,以便使用 $_FILES 变量。这会有所帮助。 确保为 cURL 提供完整的绝对路径。否则你会得到错误。

请在此处参考相同类型的 SO 问题:File Upload to Slim Framework using curl in php

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    在 php 5.2.6 及更低版本中有一个bug。验证您的 php 版本并测试最新版本。这可能是问题所在。

    【讨论】:

    • 问题是关于从命令行使用 cURL,而不是从 PHP。
    【解决方案3】:

    如果您希望能够使用 $app->request->post('content'); 访问文件的内容,则您的 curl 请求必须使用 < 而不是 @ 用于 content 字段,

    curl -i http://localhost/test/index.php -X POST -F "name=file.png" \
      -F "content=</var/www/html/test/file.png"
    

    来自 curl 的手册页:

    强制 'content' 部分是一个文件,在文件名前加上 @ 符号。要仅从文件中获取内容部分,请在文件名前加上符号

    通过使用@,您将该字段标记为文件。从技术上讲,这会在字段中添加一个Content-Disposition 标头(RFC 2388,如果您有兴趣)。正如 Raphaël Malié 在评论中所说,PHP 检测到并自动将字段存储在 $_FILES 中而不是 $_POST 中,这就是为什么您无法使用 $app-&gt;request-&gt;post 访问内容的原因。

    不过,如果您想支持使用浏览器的 &lt;input type=file&gt; 元素和表单进行上传,您应该考虑在后端使用 $_FILES。那些总是设置一个Content-Disposition 标头。

    【讨论】:

    • 感谢您的回答,我会试一试。你会推荐哪种方法?从 @ 更改为 $_FILES?
    • 如果您不确定,请切换到$_FILES。 (There's documentation in case you need it.) 以这种方式处理上传是标准的,虽然我能想到你想避免它的情况,但它们都相当深奥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2016-08-12
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多