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


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

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

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

Расположение содержимого: форма-данные; имя="файл"; имя файла="/путь/к/файлу.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"

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

Author: Teiv, 2013-02-28

3 answers

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

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

 18
Author: Rudie, 2015-07-31 20:42:31

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

$realpath = realpath($uploadfile);

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

 9
Author: Teiv, 2013-03-02 01:45:23

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

 0
Author: davidethell, 2013-02-28 04:56:41