Blobstore API を使用すると、blob と呼ばれるデータ オブジェクトをアプリケーションで提供できるようになります。blob は、Datastore サービスのオブジェクトに許可されているサイズよりはるかに大きいサイズのオブジェクトです。blob は、動画や画像などのサイズの大きいファイルを提供する場合や、ユーザーがサイズの大きいデータファイルをアップロードする場合に便利です。blob は HTTP リクエストでファイルをアップロードすることによって作成されます。通常アプリケーションでこの処理を行うには、ファイル アップロード用のフィールドを含むフォームをユーザーに提示します。フォームが送信されると、Blobstore によってファイルの内容から blob が作成され、blob への不透明な参照(blob キー)が返されます。このキーは後で blob を提供するときに使用できます。アプリケーションは、ユーザー リクエストに応じて完全な blob 値を提供でき、あるいはファイルに似たストリーミング インターフェースを使用して、値を直接読み取ることができます。
Blobstore を導入する
App Engine には Blobstore サービスが含まれています。このサービスを利用すると、アプリケーションでデータ オブジェクトを提供できます。制限は 1 回の HTTP 接続でアップロードまたはダウンロードできるデータ量のみです。これらのオブジェクトを Blobstore 値または blob と呼びます。Blobstore 値はリクエスト ハンドラからのレスポンスとして提供され、ウェブフォームを通じたアップロード データとして作成されます。blob データは、アプリケーションで直接作成されるのではなく、送信されたウェブフォームや他の HTTP POST
リクエストによって間接的に作成されます。Blobstore API を使用すると、Blobstore 値をユーザーに送信することや、ファイルに似たストリームでアプリケーションから Blobstore 値にアクセスできます。
アプリケーションで Blobstore 値のアップロードをユーザーに促すには、ファイル アップロード用のフィールドを含むウェブフォームを提示します。アプリケーションは、Blobstore API を呼び出してフォームのアクション URL を生成します。ユーザーのブラウザは、生成された URL を通じてファイルを Blobstore に直接アップロードします。次に、Blobstore は blob を保存し、blob キーが含まれるようにリクエストを書き換えて、アプリケーションのパスに渡します。そのパスにはアプリケーションのリクエスト ハンドラがあり、そこで追加のフォーム処理を行うことができます。
blob を提供するには、アプリケーションで送信レスポンスにヘッダーを設定します。このレスポンスは App Engine で blob 値に置き換えられます。
作成した blob は変更できませんが、削除することはできます。各 blob には対応する blob 情報レコードがあり、データストアに保存されています。blob 情報レコードを参照すると、作成日時やコンテンツ タイプなどの blob の詳細がわかります。blob キーを使用して blob 情報レコードをフェッチし、そのプロパティへのクエリができます。
Blobstore を使用する
Blobstore を使用すると、ユーザーからアップロードされるサイズの大きなファイルをアプリケーションで受け取ることや提供することができます。アップロードされたファイルは blob と呼ばれます。アプリケーションが直接 blob にアクセスすることはありません。代わりに、Datastore の blob 情報エンティティ( クラス)を介して blob を操作します。
ユーザーは 1 つ以上のファイル入力フィールドを含む HTML フォームを送信して blob を作成します。アプリケーションは、このフォームの宛先(アクション)としてを設定します。 この関数には、アプリケーションのハンドラの URL パスを渡します。ユーザーがフォームを送信すると、指定されたファイルがユーザーのブラウザから Blobstore に直接アップロードされます。Blobstore はユーザーのリクエストを書き換え、アップロードされたファイルデータを保存します。その際、アップロードされたファイルデータを 1 つ以上の対応する blob キーで置き換えます。その後、書き換えたリクエストを、に指定された URL パスにあるハンドラに渡します。
このハンドラは、blob キーに基づいて追加の処理を行えます。
アプリケーションは、Blobstore 値の一部を読み取るために
blob をアップロードする
blob を作成してアップロードする手順は次のとおりです。
1. アップロード URL を作成する
を呼び出して、ユーザーが記入するフォームのアップロード URL を作成し、そのフォームの POST
が完了したときに読み込むアプリケーション パスを渡します。
非同期バージョンの create_upload_url_async()
があります。このバージョンでは、Blobstore がアップロード URL を生成している間も、アプリケーション コードを実行し続けることができます。
2. アップロード フォームを作成する
フォームにはファイル アップロード用のフィールドを含め、フォームの enctype
を multipart/form-data
と設定する必要があります。ユーザーがフォームを送信すると、Blobstore API が POST
を処理し、blob を作成します。この API はさらに、blob の情報レコードを作成してデータストアに保存し、指定されたパスにあるアプリケーションに、blob キーに書き換えたリクエストを渡します。
サーバーレス NEG を使用するグローバル外部アプリケーション ロードバランサを使用して、blobstore.create_upload_url
呼び出しから返された /_ah/upload/
URL に送信されたアップロード リクエストを処理することはできません。代わりに、これらのアップロード リクエストを App Engine サービスに直接ルーティングする必要があります。これを行うには、appspot.com
ドメインまたは App Engine サービスに直接マッピングされたカスタム ドメインを使用します。
3. アップロード ハンドラを実装する
このハンドラでは、blob キーとともにアプリケーションのデータモデルの残りの部分を保存できます。blob キー自体には、Datastore の blob 情報エンティティから引き続きアクセスできます。ユーザーがフォームを送信し、ハンドラが呼び出された時点で、blob はすでに保存され、blob 情報が Datastore に追加されていることに注意してください。アプリケーションに blob を保持しない場合は、すぐに blob を削除して blob が孤立しないようにしてください。
すべての Flask アプリの場合、BlobstoreUploadHandler
クラスのメソッドに対するすべての呼び出しでは request.environ dictionary
が必要です(flask モジュールからのインポート リクエスト)。ウェブ フレームワークを備えていない WSGI アプリの場合は、get_uploads()
メソッドで environ
パラメータを使用します。
ユーザーのリクエストを書き換えるとき、Blobstore はアップロードされたファイルの MIME パーツを空にして、blob キーを MIME パーツのヘッダーとして追加します。他のすべてのフォーム フィールドとパーツは保持され、アップロード ハンドラに渡されます。コンテンツ タイプを指定していない場合、Blobstore はファイル拡張子から推定を試みます。コンテンツ タイプを判断できない場合は、新しく作成された blob にコンテンツ タイプ application/octet-stream
を割り当てます。
blob を提供する
blob を提供するには、blob のダウンロード ハンドラをパスとしてアプリケーションに含める必要があります。
このハンドラは、目的の blob の blob キーを blobstore.Send
に渡す必要があります。