在cURL中更改上传文件的名称?

时间:2013-02-28 04:49:47

标签: php post curl

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

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

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

  

内容 - 处置:表单数据; NAME = “文件”;文件名= “/路径/到/ file.ext”

但我希望它只是

  

内容 - 处置:表单数据; NAME = “文件”;文件名= “file.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”

有人能告诉我怎么做吗?

3 个答案:

答案 0 :(得分:18)

新方法(自PHP 5.5开始)使用CURLFile

$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);

或类似的东西。

答案 1 :(得分:11)

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

$realpath = realpath($uploadfile);

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

答案 2 :(得分:0)

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