Изменить имя загружаемого файла в 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.ext"

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

Content-Disposition: form-data; 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"

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

Новый метод (начиная с 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 или двоичную строку данных вместо ссылки на имя файла.