Изменить имя загружаемого файла в 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"
Кто-нибудь может сказать мне, как это сделать, пожалуйста?
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);
Или что-то в этом роде.
Пожалуйста, поправьте меня, если я ошибаюсь, но загрузка cURL не будет работать с относительным путем. Ему всегда нужен абсолютный путь, например
$realpath = realpath($uploadfile);
Поэтому, если кто-то хочет скрыть местоположение своего файла на своем веб-сервере при загрузке, либо переместите его во временную папку, либо используйте fsockopen() (см. Этот пример в Примечаниях пользователя к руководству по PHP)
Вам нужно будет поместить файл во временную область, а затем ссылаться на файл оттуда, если вы хотите скрыть истинное местоположение файла. К сожалению, CURL не поддерживает отправку только двоичных данных, иначе вы могли бы просто отправить строку base64 или двоичных данных вместо ссылки на имя файла.