无法使用 cURL 将文件作为表单数据发送

Can't send file as form data using cURL

我正在尝试通过命令行发送 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');

如果您希望能够使用 $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 的联机帮助页:

To force the 'content' part to be a file, prefix the file name with an @ sign. To just get the content part from a file, prefix the file name with the symbol <. The difference between @ and < is then that @ makes a file get attached in the post as a file upload, while the < makes a text field and just get the contents for that text field from a file.

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

不过,如果您希望支持使用浏览器的 <input type=file> 元素和表单进行上传,则应考虑在后端切换为使用 $_FILES。那些总是设置 Content-Disposition header.

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

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

请在此处引用同类SO问题:File Upload to Slim Framework using curl in php

希望对您有所帮助。