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