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».
Создайте многостраничный заголовок (см. Код ниже)
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); }
Используйте эту функцию;)
$postfields = $this->curl_custom_postfields($files);
Добавить границу в http-заголовок
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; boundary=' . $postfields[1], 'Accept: application/vnd.de.mobile.api+json'));
Добавить почтовые поля
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields[0]);
Это не самое чистое решение, поэтому, пожалуйста, используйте его с осторожностью. Но, по крайней мере, это работает.
У меня такая же проблема, и я нашел решение, но только для одиночных изображений. Фокус в том, что ваш массив ДОЛЖЕН выглядеть так:
$images = array( 'image' => 'PATH/IMG.jpg', );
Это означает, что ключ должен быть «образ» и ничего другого! Надеюсь, это поможет 😉