15

我想使用 cURL 上传文件。由于 cURL 需要文件的完整路径,所以这是我的代码:

curl_setopt($ch, CURLOPT_POSTFIELDS, array("submit" => "submit", "file" => "@path/to/file.ext"));
curl_exec($ch);

但是 cURL 也会在请求标头中发布文件的完整路径:

内容处置:表单数据;名称=“文件”;文件名="/path/to/file.ext"

但我希望它只是

内容处置:表单数据;名称=“文件”;文件名="文件.ext"

所以我将代码更改为

curl_setopt($ch, CURLOPT_POSTFIELDS, array("submit" => "submit", "file" => "@file.ext"));
chdir("path/to"); # change current working directory to where the file is placed
curl_exec($ch);
chdir("path"); # change current working directory back

然后 cURL 简单地抛出一条错误消息

无法打开文件“file.ext”

谁能告诉我该怎么做?

4

3 回答 3

22

使用CURLFile的新方法(自 PHP 5.5 起):

$file = new CURLFile('path/to/file.ext');
$file->setPostFilename('file.ext');

使用它几乎相同:

"file" => $file

旧方法

代替

"file" => "@path/to/file.ext"

你可以告诉 cURL 使用另一个文件名:

"file" => "@path/to/file.ext; filename=file.ext"

这样它将path/to/file.ext用作文件源,但file.ext用作文件名。

不过,您将需要一个非常绝对的路径,因此您可能缺少前导/: /path/to/file.ext。由于您使用的是 PHP,因此请始终执行以下操作realpath()

"file" => '@' . realpath($pathToFile) . '; filename=' . basename($pathToFile);

或类似的东西。

于 2014-01-28T00:36:20.417 回答
13

如果我错了,请纠正我,但 cURL 上传不适用于相对路径。它总是需要一个绝对路径,喜欢

$realpath = realpath($uploadfile);

因此,如果有人想在上传时隐藏其网络服务器上文件的位置,请将其移动到临时文件夹或使用 fsockopen()(请参阅PHP 手册的用户贡献说明中的此示例)

于 2013-03-02T01:45:23.560 回答
0

如果您想隐藏真实的文件位置,您需要将文件放在一个临时区域中,然后从那里引用该文件。不幸的是,cURL 不支持只发送二进制数据,否则您可以只发送 base64 或二进制数据字符串而不是文件名引用。

于 2013-02-28T04:56:41.713 回答