5

我在这里有一个小问题,我怎样才能告诉 cURL 专门将文件附加到请求中?

如果我使用 cURL 上传文件,则常用方法是将其作为 POST 数据数组的一部分附加,其值前面有 @,例如:

CURLOPT_POSTFIELDS=>array('my-file'=>'@my-file.txt')

这显然可行,但我有两个问题:

  • 如果它实际上不是我正在上传的文件怎么办?如果我的 POST 值实际上是“@my-file.txt”并且它尝试上传文件怎么办?它创造了一个我拼命想要避免的漏洞。
  • 如何从 URL 上传文件?我是否必须下载它,将其存储在临时文件夹中,然后使用该临时文件夹中的 @ 附加它?为什么我不能只给 cURL 我希望用作文件的内容?

cURL CURLOPT_INFILE 不是一个选项,因为它不会显示为 $_FILES 数组的一部分。

依赖 POST 字段值中的 @ 符号似乎是 cURL 中的这样一个漏洞。有办法解决吗?为什么没有 CURLOPT_FILEFIELDS 数组?命令行 cURL 对此有一个单独的标志 (-F),但出于某种原因,我不认为它是 PHP 中的一个选项。

任何帮助将不胜感激,谢谢!

4

2 回答 2

2

如果有人在 2019 年及以后在 Google 上找到此结果(如我所见)后查看此问题,则问题已根据此错误修复得到解决。

您现在可以使用 CURLFile 通过 PHP CURL 请求发送文件,如下所示:

$fullpath = '/var/www/html/website/test.png';
$mime = 'image/png';
$publicname = 'testpic';
$cfile = curl_file_create($fullpath,$mime,$publicname);
$fields[$publicname] = curl_file_create($fullpath,$mime,$publicname);

然后将用于例如

curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

更多信息可以在这里找到。

于 2019-10-03T15:14:37.737 回答
1

我最终做的是检测是否有任何输入数据以 @ 符号开头,如果是,则将它们作为 GET 变量提交(作为 cURL 中提交 URL 的一部分)。它对所有情况都没有帮助(例如提交以@开头的大字符串时),但可以解决我在 Twitter 句柄方面遇到的问题。

于 2012-08-23T10:23:11.277 回答