我想使用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”
有人能告诉我怎么做吗?
答案 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或二进制数据字符串而不是文件名引用。