Как отправить поля формы и файл с помощью PHP Curl?

Я пытаюсь отправить поля формы и файл в веб-службу, используя 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

Любые идеи?


person blank    schedule 15.04.2010    source источник


Ответы (2)


Массив для строкового уведомления у вас есть со следующим кодом:

$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&para2=val2&...', либо в виде массива с именем поля в качестве ключа. и данные поля в качестве значения.
Если значение представляет собой массив, заголовок Content-Type будет иметь значение multipart/form-data.

person Pascal MARTIN    schedule 15.04.2010
comment
Спасибо, теперь я передаю имя файла с @, но я все еще получаю ошибку многостраничной границы. - person blank; 15.04.2010

попробуй это,

$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);
person MAS1    schedule 15.04.2010