Изменить имя файла загрузки в cURL?

Я хочу загрузить файл с помощью cURL. Поскольку cURL требует полного пути к файлу, вот мой код:

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

однако cURL также опубликует этот полный путь файла в заголовке запроса:

Content-Disposition: form-data; name="file"; filename="/path/to/file.ext"

но я хочу, чтобы это было просто

Content-Disposition: form-data; name= "file"; filename= " 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 просто выдает сообщение об ошибке

не удалось открыть файл " файл.ext"

может кто-нибудь сказать мне, как это сделать, пожалуйста?

3 ответов


новый метод (начиная с 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);

или что-то в этом роде.


пожалуйста, поправьте меня, если я ошибаюсь, но curl upload не будет работать с относительным путем. Ему всегда нужен абсолютный путь, нравится

$realpath = realpath($uploadfile);

поэтому, если кто-то хочет скрыть местоположение своего файла на своем веб-сервере при загрузке, переместите его во временную папку или используйте fsockopen() (см. Это пример В примечаниях пользователя PHP Manual)


вам нужно будет поместить файл во временную область, а затем ссылаться на файл оттуда, если вы хотите скрыть истинное местоположение файла. К сожалению, cURL не поддерживает отправку только двоичных данных, иначе вы можете просто отправить строку base64 или двоичных данных вместо ссылки на имя файла.