2

この問題について 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>";

そして何も起こりません...ここで何か助けはありますか?

ありがとう

4

4 に答える 4

2

ファイルオブジェクトの適切なマルチパートヘッダーを使用して、生の画像データ (base64 でエンコードされていない) を投稿する必要があります。これが実際の例です ( ACCESS_TOKENITEM_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'
    )
);
?>
于 2015-05-12T20:16:01.970 に答える
0

厳密に言えば、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--

上記の 2 つの例では、画像をアップロードします。

-- 「イメージ バイナリ データ」は誤解を招く可能性があります。これは、すべての検索でイメージ バイナリが base64_encode 関数を使用して取得されることが示されたからです。私の実験では、base64_encoding は何もしません。file_get_contents でファイルを開くだけです。

-- cURL リクエストでは、ヘッダーの Content-Type を multipart/form-data に設定し、リクエストと同じ境界を持つ必要があります。以下の例:

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $personalAccessToken, 'Content-Type: multipart/form-data; boundary=' . $boundary ));

したがって、これにより別のソリューションがミックスに追加されます。

于 2015-07-29T19:43:04.273 に答える
0

これは、PNG 画像をアップロードするための私の PHP 実装です。別のコード ビューが役立つ場合があります。

@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);
于 2015-06-05T15:08:47.123 に答える