再開可能なアップロード

このページでは、REST プロトコルを使用して Google Photos Library API に再開可能なアップロードをリクエストする方法について説明します。このプロトコルを使用すると、通信障害でデータフローが中断した後にアップロード操作を再開できます。

次の場合は、再開可能なアップロード オプションを使用します。

  • サイズの大きなファイルをアップロードする。
  • ネットワークの中断やその他の送信障害が発生する可能性は、 高(モバイルアプリからファイルをアップロードする場合など)。

再開可能なアップロードでは、ネットワーク障害が発生したときに、サイズの大きなファイルのアップロードを最初からやり直す必要がないため、帯域幅の消費を減らすことができます。

ステップ 1: アップロード セッションを開始する

https://photoslibrary.googleapis.com/v1/uploads に POST リクエストを送信して、再開可能なアップロード セッションを開始します。再開可能なアップロードの使用 このリクエストで返された URL から、ファイルをアップロードします。

POST リクエストには、次のヘッダーを含める必要があります。

ヘッダー フィールド
Content-Length リクエストの本文が空であるため、0 に設定します。
X-Goog-Upload-Command start に設定します。
X-Goog-Upload-Content-Type ファイルの MIME タイプに設定します(例: image/jpeg
X-Goog-Upload-Protocol resumable に設定します。
X-Goog-Upload-Raw-Size 取得するファイルデータの合計バイト数に設定します 転送されます。

POST リクエストのヘッダーは次のようになります。

POST https://photoslibrary.googleapis.com/v1/uploads
Authorization: Bearer oauth2-token
Content-Length: 0
X-Goog-Upload-Command: start
X-Goog-Upload-Content-Type: mime-type
X-Goog-Upload-Protocol: resumable
X-Goog-Upload-Raw-Size: bytes-of-file

ステップ 2: セッションの URL を保存する

成功すると、POST リクエストは次のような 200 OK HTTP ステータス コードを返します。 追加します。

X-Goog-Upload-URL: url-to-make-uploads-to
X-Goog-Upload-Chunk-Granularity: chunk-granularity-in-bytes

ヘッダー フィールド x-goog-upload-chunk-granularity には、クライアントによって送信されたすべてのデータチャンクに対するバイト配置とサイズの粒度が含まれます。複数のチャンクでアップロードが行われる場合、最後のアップロードを除くすべてのアップロードは、この値の倍数で行われる必要があります。つまり、ファイルのアップロード バイトをこの値に揃える必要があります。最後のチャンクでは、残りのモジュールを あります。

ヘッダー フィールド X-Goog-Upload-URL には一意の URL が含まれています。この URL を使用して、 残りのすべてのリクエストでアップロードが完了します。その後のリクエストに使用できるように、この再開可能なセッションの URL をコピーして保存しておきます。

ステップ 3: ファイルをアップロードする

再開可能なセッションでファイルをアップロードするには、2 つの方法があります。

  1. 単一リクエストで通常はこの方法が最適です。リクエストの数が少なく、パフォーマンスが向上します。
  2. 複数のチャンク。 この方法では データをチャンク化して複数のリクエストで データをチャンク化できますデータは x-goog-upload-chunk-granularity の倍数でチャンクされます。必要に応じて チャンクされたリクエストを再試行できます。

    次の場合に使用します。

    • 1 つのリクエストで転送するデータの量を減らす必要がある。期限が固定されている場合に、この操作が必要になることがあります。 できます。
    • アップロードを示すカスタム インジケーターを提供する必要があります できます。
    • 安全にデータを破棄できるタイミングを知る必要がある場合。

単一のリクエスト

ファイルを単一リクエストでアップロードするには:

  1. 再開可能なセッションの URL への POST リクエストを作成します。
  2. ファイルのデータをリクエストの本文に追加します。
  3. 次の HTTP ヘッダーを追加します。

    • Content-Length: ファイルのバイト数に設定します。
    • X-Goog-Upload-Command: upload, finalize に設定します。
  4. リクエストを送信します。

アップロード リクエストが中断された場合、または 5xx が表示された場合 をご覧ください。

リクエストが成功すると、レスポンスの本文で 200 OK HTTP ステータス コードとアップロード トークンを受け取ります。作成 このアップロード トークンを使用してメディア アイテムを取得します。

複数のチャンク

複数のチャンクでファイルをアップロードするには:

  1. 再開可能なセッションの URL への POST リクエストを作成します。
  2. リクエストの本文にチャンクのデータを追加します。

    アップロードを完了する最後のチャンクを除くチャンクを、チャンクの許容サイズの倍数で作成します。現在の アップロードが効率的に行われるように、チャンクサイズを大きくします。

  3. 次の HTTP ヘッダーを追加します。

    • Content-Length: ファイルのバイト数に設定します。 分割されます。
    • X-Goog-Upload-Command: upload に設定します。最後のチャンクでは、upload, finalize に設定します。
    • X-Goog-Upload-Offset: バイトが書き込まれるオフセットに設定します。バイトは順番にアップロードする必要がある点に注意してください。最初のオフセットは 0 です。
  4. リクエストを送信します。

    アップロード リクエストが中断された場合、または 5xx のレスポンスを受け取った場合は、中断されたアップロードを再開するの手順に沿って対応してください。

  5. ファイル内の残りのチャンクごとに、上記の手順を繰り返します。

リクエストが成功すると、レスポンスの本文で 200 OK HTTP ステータス コードとアップロード トークンを受け取ります。作成 このアップロード トークンを使用してメディア アイテムを取得します。

単一のリクエスト

次の例は、1 回のリクエストで 3,039,417 バイトの JPEG ファイルをアップロードする再開可能なリクエストを示しています。

POST https://photoslibrary.googleapis.com/v1/uploads HTTP/1.1
Content-Length: 0
X-Goog-Upload-Command: start
X-Goog-Upload-Content-Type: image/jpeg
X-Goog-Upload-Protocol: resumable
X-Goog-Upload-Raw-Size: 3039417
[no body]

レスポンスには、アップロード URL と、予想されるチャンクサイズが含まれます。

HTTP/1.1 200 OK
X-Goog-Upload-URL: https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable
X-Goog-Upload-Chunk-Granularity: 262144

最後のアップロード リクエストは次のようになります。

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 3039417
X-Goog-Upload-Command: upload, finalize
X-Goog-Upload-Offset: 0

[BYTES 0-4199999]

複数のチャンク

次の例は、Cloud Storage バケットをアップロードする再開可能なリクエストを示しています。 複数のチャンク形式の 3,039,417 バイトの JPEG ファイル(再開可能セッションを使用) URL と、前のステップで取得した受け入れ可能なチャンクサイズの粒度。 この例では、アップロード セッションの初期化時にヘッダー フィールド x-goog-upload-chunk-granularity で返された 262,144 バイトのチャンクサイズを使用します。各アップロードには、300 バイト以上の 262,144 の倍数です。

前の手順で説明したように、アップロード セッションを初期化して、アップロード URL とチャンクサイズを受け取ります。

POST https://photoslibrary.googleapis.com/v1/uploads HTTP/1.1
Content-Length: 0
X-Goog-Upload-Command: start
X-Goog-Upload-Content-Type: image/jpeg
X-Goog-Upload-Protocol: resumable
X-Goog-Upload-Raw-Size: 3039417
[no body]

レスポンスには、アップロード URL と、予想されるチャンクサイズが含まれます。

HTTP/1.1 200 OK
X-Goog-Upload-URL: https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable
X-Goog-Upload-Chunk-Granularity: 262144

最初のチャンク:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 1048576
X-Goog-Upload-Command: upload
X-Goog-Upload-Offset: 0

[BYTES 0-1048575]

2 番目のチャンク:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 1048576
X-Goog-Upload-Command: upload
X-Goog-Upload-Offset: 1048576

[BYTES 1048576-2097151]

最後のチャンク:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 942265
X-Goog-Upload-Command: upload, finalize
X-Goog-Upload-Offset: 2097152

[BYTES 2097152-4200000]

中断されたアップロードの再開

アップロード リクエストが中断された場合、または 200 以外の HTTP ステータスが返された場合 サーバーにクエリを実行して、アップロードが成功した回数を確認します。

以下は、再開可能セッション URL への POST リクエストです。X-Goog-Upload-Command query に設定する必要があります。

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 0
X-Goog-Upload-Command: query

サーバーからのレスポンスには、200 OK HTTP ステータス コードと、 アップロードの現在のサイズを指定します。

HTTP/1.1 200 OK
X-Goog-Upload-Status: active
X-Goog-Upload-Size-Received: 100

このオフセットでアップロードを再開できます。再開する場合は、サーバーから提供されたオフセットで行う必要があります。ただし、upload コマンドと finalize コマンドを組み合わせて送信する場合は、オフセットを 0 で再開することもできます。

クエリコマンドの HTTP レスポンスに X-Goog-Upload-Status ヘッダーが存在し、値が active でない場合は、アップロードがすでに終了していることを示しています。