Как отправить поля формы и файл с помощью PHP Curl? - PullRequest
1 голос
/ 15 апреля 2010

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

Если я тогда принудительно заставлю составной элемент / форму с помощью curl_setopt, я получаю ошибку, в которой нет границы:

org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2010

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

$fields = array(
  'title'=>$title,
  'content'=>$content,
  'category'=>$category,
  'attachment'=>$_FILES['attachment']
);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $fields);

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

0 голосов
/ 15 апреля 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...