PHP cURL: загрузить файл из формы в удаленный API? - PullRequest
0 голосов
/ 21 июня 2011

Я пытаюсь загрузить файл в форму на моем сайте, а затем передать его в удаленный API.

Это мой PHP:

$fields = array(
    'file'=>$_FILES["mediaupload"],
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
);
$fields_string = http_build_query($fields);
$url = my_url;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec ($ch);

В настоящее время я получаю сообщения об ошибках, что файл не может быть обработан должным образом.API ожидает все поля как строки POST, кроме файла, который он ожидает в двоичном виде.

Я знаю, что будет сложно отладить это для вас, ребята, без доступа к удаленному API, но я делаю что-нибудь очевидно неправильно, или это должно работать?

Большое спасибо.

1 Ответ

5 голосов
/ 21 июня 2011

Загрузка файлов с использованием curl не работает так.Вам нужно сначала сохранить файл локально, используя php move_uploaded_file, а затем получить путь к файлу.В полях добавьте это,

$fields = array(
    'file'=>"@/path/to/myfile.ext",
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
);

Кроме того, я не уверен, нужно ли преобразовывать массив полей в строку для использования в качестве постполей.В соответствии с руководством это может быть array () напрямую.

CURLOPT_POSTFIELDS Полные данные для отправки в операции HTTP "POST"Чтобы опубликовать файл, добавьте @ к имени файла и используйте полный путь.Тип файла можно явно указать, следуя имени файла с типом в формате '; type = mimetype'.Этот параметр может быть передан в виде строки в кодировке urlen, например, 'para1 = val1¶2 = val2 & ...', или в виде массива с именем поля в качестве ключа и данными поля в качестве значения.Если значение является массивом, заголовок Content-Type будет установлен в multipart / form-data.Начиная с PHP 5.2.0, файлы, которые передаются в эту опцию с префиксом @, должны работать в виде массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...