Я рассмотрел старые вопросы, опубликованные здесь, на Stackoverflow, об этой проблеме.
Но я не нашел ни одного примера для интеграции php.
Вот пример моего кода, чтобы сделать это, но он терпит неудачу
$url = 'https://connect.squareup.com/v1/me/items/9999999/image';
$auth_bearer = 'Authorization: Bearer ' . $this->accessToken;
$image_data = base64_encode(file_get_contents('image.jpeg'));
$header = array(
$auth_bearer,
'Accept: application/json',
'Content-Type: multipart/form-data; boundary=BOUNDARY',
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'files=' . $image_data);
$head = curl_exec($ch);
curl_close($ch);
$response = json_decode($head);
echo "<pre>";
print_r($response);
echo "</pre>";
И ничего не происходит … любая помощь здесь?
Спасибо
Вам необходимо опубликовать необработанные данные изображения (не в кодировке base64) с правильным многокомпонентным заголовком для файлового объекта. Вот рабочий пример (заменить ACCESS_TOKEN
, ITEM_ID
, а также IMAGE_FILE
).
<?php
function uploadItemImage($url, $access_token, $image_file) {
$headers = ["Authorization: Bearer $access_token"];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['image_data' => "@$image_file"]);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
$return_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
print "POST to $url with status $return_status\n";
curl_close($ch);
return $data ? json_decode($data) : false;
}
print_r(
uploadItemImage(
'https://connect.squareup.com/v1/me/items/ITEM_ID/image',
'ACCESS_TOKEN',
'IMAGE_FILE.jpg'
)
);
?>
Вот моя реализация PHP для загрузки изображения в формате PNG. Иногда помогает другое представление кода.
Как сказал @Troy, важным полем для изображений является «Content-Type: multipart / form-data». Все остальное, что я загружаю в Square, использует «Content-Type: application / json».
$square_url = 'https://connect.squareup.com/v1/me/items/' . $square_item_id . '/image';
$cfile = new CURLFile($image_path_on_server, 'image/png', 'image_data');
$image_data = array('image_data' => $cfile);
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer ' . $access_token,
'Content-Type: multipart/form-data',
'Accept: application/json'
));
curl_setopt($curl, CURLOPT_POSTFIELDS, $image_data);
curl_setopt($curl, CURLOPT_URL, $square_url);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, TRUE);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLINFO_HEADER_OUT, TRUE);
curl_setopt($curl, CURLOPT_VERBOSE, TRUE);
$json = curl_exec($curl);
curl_close($curl);
Строго говоря, документация Square API, их метод может быть реализован с учетом нескольких вещей.
— Ваш запрос должен быть заключен в границу и содержать расположение Контента, имя, имя файла, тип контента, как в примере ниже.
--BOUNDARY
Content-Disposition: form-data; name="image_data"; filename="MyImage.png"Content-Type: image/png
{BLANK LINE IS REQUIRED}
IMAGE BINARY DATA GOES HERE
--BOUNDARY--
По сути, формат запроса должен быть точно таким, как указано в примере. Это включает в себя «границу», символы новой строки, необходимые заголовки, пустую строку между заголовками (по какой-то причине ничего не работает, если строка отсутствует) и фактические двоичные данные изображения. ПРИМЕЧАНИЕ: граница может быть любой строкой, которую вы выберете, но она должна использоваться последовательно. В коде это будет выглядеть примерно так:
$boundary = "---------------------" . md5(mt_rand() . microtime());
$imageToUpload = "--{$boundary}" . "\r\n" .
"Content-Disposition: form-data; name=\"image_data\"; filename=\"" . $full_path_to_image_file . "\"" . "\r\n" .
"Content-Type: image/jpeg" . "\r\n" .
"\r\n" . // <- empty line is required
(file_get_contents($full_path_to_image_file)) . "\r\n" .
"--{$boundary}--";
Выше будет выдан запрос, который выглядит следующим образом:
-----------------------51b62743876b1201aee47ff4b1910e49
Content-Disposition: form-data; name="image_data"; filename="/some/directory/image.jpg"Content-Type: image/jpeg
����
-----------------------51b62743876b1201aee47ff4b1910e49--
— Технически говоря, Content-Type в запросе должен меняться в зависимости от типа загружаемого изображения (image / jpeg или image / png). Вы можете установить тип контента для application / octet-stream, чтобы охватить всю базу.
-----------------------51b62743876b1201aee47ff4b1910e49
Content-Disposition: form-data; name="image_data"; filename="/some/directory/image.jpg"Content-Type: application/octet-stream
����
-----------------------51b62743876b1201aee47ff4b1910e49--
Два приведенных выше примера загрузят изображение.
— «Двоичные данные изображения» могут вводить в заблуждение, поскольку каждый мой поиск показал, что двоичный файл изображения получается с помощью функции base64_encode. В моих экспериментах base64_encoding ничего не делает. Вам нужно только открыть файл с file_get_contents.
— В вашем запросе cURL должен быть установлен тип содержимого заголовка multipart / form-data, и он должен иметь ту же границу, что и запрос. Пример ниже:
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $personalAccessToken, 'Content-Type: multipart/form-data; boundary=' . $boundary ));
Таким образом, это добавляет другое решение для смеси.