Я пытаюсь отправить поля формы и файл в веб-службу, используя php curl. Форма уже была передана из браузера в веб-приложение прокси-клиента php, и я пытаюсь перенаправить его в веб-службу.
Когда я передаю массив в curl_setopt следующим образом:
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $this->fields);
Я получаю уведомление Array to String, хотя оно предназначено для массива. Вот мой массив, который передается в $this->fields в конструкторе.
$fields = array('title'=>$title,
'content'=>$content,
'category'=>$category,
'attachment'=>$_FILES['attachment']);
Если я передаю строку с помощью http_build_query, мой веб-сервис жалуется на отсутствие данных из нескольких частей/форм.
Если я затем форсирую enctype multipart/form с помощью curl_setopt, я получаю сообщение об ошибке, говорящее, что границ нет:
org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
Любые идеи?
Ответ 1 · рейтинг 3 · Pascal MARTIN
Массив для строкового уведомления у вас есть со следующим кодом:
$fields = array(
'title'=>$title,
'content'=>$content,
'category'=>$category,
'attachment'=>$_FILES['attachment']
);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $fields);
это не потому, что вы передаете массив в качестве третьего параметра curl_setopt : это потому, что вы передаете массив для attachment.
Если вы хотите передать файл таким образом, вы должны передать его абсолютный путь, добавив перед ним @ :
$fields = array(
'title'=>$title,
'content'=>$content,
'category'=>$category,
'attachment'=> '@' . $_FILES['attachment']
);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $fields);
(Предполагается, что $_FILES['attachment'] содержит полный путь к вашему файлу - вы сами можете изменить этот код, чтобы он использовал правильные данные, если это необходимо)
В качестве справки, цитируя страницу руководства curl_setopt, для вариант CURLOPT_POSTFIELDS :
Полные данные для публикации в операции HTTP "POST".
Чтобы опубликовать файл, добавьте к имени файла @ и укажите полный путь.
Это можно передать либо в виде строки с URL-адресом, например 'para1=val1¶2=val2&...', либо в виде массива с именем поля в качестве ключа. и данные поля в качестве значения.
Если значение представляет собой массив, заголовок Content-Type будет иметь значение multipart/form-data.
Ответ 2 · MAS1
попробуй это,
$filePath = "abc\\xyz.txt";
$postParams["uploadfile"] = "@" . $filePath;
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, 'https://website_address');
curl_setopt($ch, CURLOPT_POST, 1 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $postParams);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
if (curl_errno($ch))
{
echo curl_error($ch);
exit();
}
curl_close($ch);