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