CURL: отправка изображений с помощью границы в REST API

Im в настоящее время работает с каким-то API. Я написал простые функции, которые позволяют мне добавлять новый контент, однако Im застревает при загрузке изображений.

Вот простая команда CURL в документации:

curl -v -s -u username:password \ -H "Content-Type: multipart/form-data" \ -H "Accept: application/api+json" \ -F "image=@img1.jpeg;type=image/jpeg" \ -F "image=@img2.jpeg;type=image/jpeg" \ -XPUT '' 

И образец ЗАПРОС:

 PUT /images HTTP/1.1 Host: example Content-Type: multipart/form-data; boundary=vjrLeiXjJaWiU0JzZkUPO1rMcE2HQ-n7XsSx --vjrLeiXjJaWiU0JzZkUPO1rMcE2HQ-n7XsSx Content-Disposition: form-data; name="image"; filename="img1.jpg" Content-Type: image/jpeg Content-Transfer-Encoding: binary 

Теперь есть моя функция:

 $headers_put = array( "Content-Type: multipart/form-data; boundary=vjrLeiXjJaWiU0JzZkUPO1rMcE2HQ-n7XsSx", "Accept: application/+json", ); function putImages($ch, $headers, $ad, $images){ $url = '/images'; $files = []; foreach($images as $key => $image) { $number = $key +1; $paths = parse_url($image, PHP_URL_PATH); $paths = $_SERVER['DOCUMENT_ROOT'] . $paths; $cfile = new CURLFile(''. $paths, 'image/jpeg', 'image'.$key); $files[$key] = $cfile; } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_POSTFIELDS, $files); $result = curl_exec($ch); var_dump($result); echo curl_getinfo($ch, CURLINFO_HTTP_CODE); echo "\n"; } 

Наконец, ответ:

 {"errors":{"error":{"@key":"unsupported-form-element"}}}" 

Что я делаю неправильно? Есть идеи? Благодарим вас за любую помощь.

После нескольких подходов использование curl_file_create, не получив его на работу. Я думаю, что mobile.de-API просто плохо реализован.

В результате я создал пользовательскую подпрограмму для CURLOPT_POSTFIELDS, которая создает полный набор вручную. Я заимствовал большую часть кода из man-страницы PHP как «класс CURLFile».

  1. Создание массива имен файлов
  2. Создайте многостраничный заголовок (см. Код ниже)

     function curl_custom_postfields(array $files = array()) { // build file parameters foreach ($files as $k => $v) { switch (true) { case false === $v = realpath(filter_var($v)): case !is_file($v): case !is_readable($v): continue; // or return false, throw new InvalidArgumentException } $data = file_get_contents($v); $body[] = implode("\r\n", array( "Content-Disposition: form-data; name=\"image\"", "Content-Type: image/jpeg", "", $data, )); } // generate safe boundary do { $boundary = "---------------------" . md5(mt_rand() . microtime()); } while (preg_grep("/{$boundary}/", $body)); // add boundary for each parameters array_walk($body, function (&$part) use ($boundary) { $part = "--{$boundary}\r\n{$part}"; }); // add final boundary $body[] = "--{$boundary}--"; $body[] = ""; // set options return array(implode("\r\n", $body), $boundary); } 
  3. Используйте эту функцию;)

     $postfields = $this->curl_custom_postfields($files); 
  4. Добавить границу в http-заголовок

     curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; boundary=' . $postfields[1], 'Accept: application/vnd.de.mobile.api+json')); 
  5. Добавить почтовые поля

     curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields[0]); 

Это не самое чистое решение, поэтому, пожалуйста, используйте его с осторожностью. Но, по крайней мере, это работает.

У меня такая же проблема, и я нашел решение, но только для одиночных изображений. Фокус в том, что ваш массив ДОЛЖЕН выглядеть так:

 $images = array( 'image' => 'PATH/IMG.jpg', ); 

Это означает, что ключ должен быть «образ» и ничего другого! Надеюсь, это поможет 😉