カテゴリー: 翻訳

The Blobstore Java API

※Google App Engine上でJavaからBlobstoreを利用する方法を説明している
The Blobstore Java APIの内容を意訳したものです。詳細は上記の原文を参照してください。

初めBLOBとは

blob

━ 【名】【C】
 (インクなどの)しみ.
 (半固体の)小塊
blob of jelly ゼリーの小塊.
 ぼんやりした(形の)もの.
語源
擬音語
New College English-Japanese Dictionary, 6th edition (C) Kenkyusha Ltd. 1967,1994,1998

のIIの意味でchunkやclusterみたいなものかと思ってましたが、

バイナリ・ラージ・オブジェクト(英: binary large object、別名BLOB)とは、データベース管理システム(DBMS)においてバイナリデータを格納する場合のデータ型である。画像や音声、その他のマルチメディアオブジェクトがBLOBとして格納される。時には実行形式が格納されることもある。(バイナリ・ラージ・オブジェクト)

というデータ型のようです。このページでは”ブロブ”と表現します。Blobstore valuesも初出後は”ブロブ”に置き換えています。


The Blobstore Java API

Blobstore APIは、DataStoreサービスで使用可能なサイズよりはるかに大きいサイズのデータオブジェクト”ブロブ”をアプリケーションで扱えるようにします。

ブロブはHTTPリクエストを使用したファイルのアップロードにより作成されます。通常、アプリケショーンはアップロードするファイルを指定するフィールドを持つフォームをユーザーに提供することによってこれを行います。フォームが送信された時、Blobstoreはファイルの内容からブロブを作成し、参照としてブロブキーを返します。


Introducing the Blobstore

Blobstoreサービスはアプリケーションで最大50MBのデータオブジェクトを使用出来るようにします。
これらのオブジェクトは”Blobstore values”または”ブロブ”と呼ばれます。ブロブはwebフォームでアップロードとして作成され、リクエストハンドラからのレスポンスとして提供されます。

アプリケーションは直接ブロブデータを作成しません。その代わりにブロブはwebフォームからの送信または他のHTTP POSTリクエストによって間接的に作成され、Blobstore APIによって間接的に提供されます。

Blobstoreサービスで定義されているブロブはdatastoreによって使用されるblob property valuesは関係がありません。

ブロブは 動画や画像などの大きいサイズファイルを提供したり、ユーザーが大きいデータファイルをアップロードすることを可能にするのに便利です。

ユーザーにブロブをアップロードさせる為に、アプリケーションはアップロードするファイルを指定するフィールドを持つwebフォームを提示します。アプリケーションはBlobstore APIをコールすることによってフォームのアクションURLを生成します。

ブラウザは生成されたURLによってBlobstoreにファイルを直接アップロードします。Blobstoreはブロブを格納した後、ブロブキーを含んだリクエストに書き直し、アプリケーションのパスに渡します。そのパスに指定されているリクエストハンドラはフォームの内容を更に処理したりリダイレクト応答を返したりできます。

ブロブを提供するために、アプリケーションはレスポンスにヘッダーを設定し、App Engineはブロブデータを持つレスポンスに置き換えます。

ブロブは削除出来ますが、作成後に修正はできません。datastoreに格納されている各ブロブはblob info record(ブロブ情報)を持ちます。これは作成日時やコンテントタイプのようなブロブの詳細情報を提供します。

ブロブキーを使ってブロブ情報を取得したり、それらのプロパティーを検索出来ます。

アプリケーションはAPIコールによってBrobstore valueの部分取得出来ます。取得出来るサイズはAPIの返す値の最大サイズまで可能です。このサイズは定数com.google.appengine.api.blobstore.BlobstoreService.MAX_BLOB_FETCH_SIZEで表される1MB弱です。

アプリケーションはユーザーによるファイルアップロード以外でブロブを作成・修正することはできません。


Using the Blobstore

アプリケーションはBlobstoreを使用してユーザーから大きいファイルを受け取ったり、それらのファイルを提供することが出来ます。アップロードされたファイルはブロブと呼ばれます。アプリケーションは直接ブロブにアクセスしません。その代わり、アプリケーションはdatastoreのBrobInfoクラスによって表されるblob info entitiesを通してブロブを扱います。

ユーザーは一つ以上のアップロードするファイルを指定するフィールドを含むHTMLフォームを送信することによってブロブを作成します。アプリケーションはこのフォームの送信先(アクション)としてblobstoreService.createUploadUrl()を設定し、アプリケーション内のハンドラのURLパスにファンクションを渡します。ユーザーがフォームを送信した時、ブラウザは指定したファイルをBlobstoreに直接アップロードします。Blobstoreはユーザーのリクエストを書き換えて、アップロードファイルを格納、アップロードされたファイルデータを一つ以上のブロブキーに置き換えます。それからblobstoreService.createUploadUrl()で提供されたURLパスのハンドラに書き換えられたリクエストを渡します。
このハンドラはブロブキーに基づいた追加処理が出来ます。最終的にハンドラはヘッダーのみ、リダイレクトレスポンスを(301,302,303)を返さなければなりません。通常、ブラウザはブロブアップロードの状態を示すページにリダイレクトされます。


Uploading a Blob

ブロブを作成/アップロードするには次の手順に従います。

・フォームアクションにとしてlobstoreService.createUploadUrlを設定します。lobstoreService.createUploadUrlの引数としてフォームのPOSTが完了した時にロードされるアプリケーションパスを渡します。

JSPで作った場合、以下のようになります。


  

    
    
  

・フォームはアップロードするファイルを指定するフィールドを含んでいなければならず、フォームのenctype属性はmultipart/form-dataに設定されていなければいけません。ユーザーがフォームを送信した時、POSTはBlobstore APIによって処理され、ブロブが作成されます。APIはまたブロブの情報データを作成してデータストアに格納したり、ブロブキーに書き換えられたリクエストを与えられたパスのアプリケーションに渡します。

・このハンドラ内で、ブロブキーをアプリケーションのデータモデルの残りと格納出来ます?(ファイルをアップロードしたユーザーなど)。ブロブキー自身はデータストア内の blob info entityからアクセスできるままです。ユーザーがフォームを送信した後、ハンドラがコールされblobは既にセーブされ、blob info がデータストアに追加されていることに注意してください。もしアプリケーションがblobを維持し続けることを望まない場合は、そのblobが取り残されたデータにならないようにすぐに削除するべきです。

以下のコードではgetUploadedBlobsメソッドはアップロードされていブロブのセットを返します。
Mapオブジェクトはそれらを含んでいたブロブとアップロードフィールドの名前を関連づけたリストです。

  Map blobs = blobstoreService.getUploadedBlobs(req);
  BlobKey blobKey = blobs.get(“myFile”);

  if (blobKey == null) {
    res.sendRedirect(“/”);
  } else {
    res.sendRedirect(“/serve?blob-key=” + blobKey.getKeyString());
  }

Blobstoreがユーザーのリクエストを書き換えた時、アップロードファイルのMIMEパートは自身のボディ部分を空にし、MAIMEパートのヘッダーとしてブロブキーを追加します。全ての他のフォームフィールドとパーツは維持されたままアップロードハンドラに渡されます。

コンテントタイプを指定していない場合、Blobstoreはファイルの拡張子からコンテントタイプを推測しようとします。
コンテントタイプを出来ない場合、新規作成されたblobのコンテントタイプはapplication/octet-streamに割り当てられます。


Serving a Blob

ブロブを提供する為に、アプリケーションのパスとしてブロブダウンロードハンドラを持たなければなりません。このハンドラは要求されたブロブのブロブキーをblobstoreService.serve(blobKey, res)メソッドに渡します。この例ではブロブキーはURL引数としてダウンロードハンドラに渡されます。実際にはダウンロードハンドラは他のメソッドやユーザーアクションのようなどんな方法でもブロブキーを取得することが可能です。

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException {
BlobKey blobKey = new BlobKey(req.getParameter(“blob-key”));
blobstoreService.serve(blobKey, res);

ブロブはどんなアプリケーションURLからでも提供出来ます。アプリケーションでブロブを提供する為に、ブロブキーを含んだ特别なヘッダーをレスポンスに入れます。App Engineはレスポンスのボディとブロブの内容を置き換えます。


Complete Sample App

我々のサンプルアプリケーションでは アプリケーションのメインURLはユーザーにファイルをアップロードするように求めるフォームをロードし、アップロードハンドラはデータ提供用のダウンロードハンドラを直接コールします。これはサンプルアプリケーションを単純化するためです。おそらく実際にはアップロードデータを要求する為にメインURLは使用しないでしょうし、アップロードしたばかりのブロブを直接提供することもないでしょう。

(略)


Using the Image Service with the Blobstore

Image サービスは画像変換のソースとしてブロブを使用することが出来ます。ソースイメージはブロブの最大サイズまで扱えます。 Imageサービスは今まで通りアプリケーションに変換したイメージを返すので変換後のイメージは1MBバイトよりも小さくなくてはいけません。これはユーザーによってアップロードされた大きい写真のサムネイルイメージを作るのに便利です。

Blobstore valueを用いたImageサービスの利用についてはhe Images Service documentationを参照してください。


Quotas and Limits(Quotasはよく知らないので手抜き)

Blobstore valueはBlobstore Stored Dataに、データストア内のBlob info entitiesはデータストアの方でカウントされます。

使用できるオブジェクトの最大サイズ:50MB
一回のAPIコールでリード出来るBlobstoreデータの最大サイズ:1MB
(上の説明では1MB弱)


Status of the Blobstore API

Blobstoreサービスは現在、実験段階です。APIを改善する為に我々はフィードバックを切望しています。
この初期の、実験段階の間、Blobstore vslueのサイズは50MBに制限されています。

Blobstoreを使用するためにはビリングを有効にしないといけません。Task Queue APIと異なり、Blobstore APIはlabsパッケージでないことに注意してください。インターフェイスの一部は将来のマイナーリリースで変更されることがあります。

勿論変更がある場合は通知しますが、Blobstore APIがlabsから離れる前に以下のことが変わるかもしれないことを心に留めておいてください。

・Blobstore valueの最大サイズなどの割り当てと制限
・機能とHTTPインタラクションを含むAPI自体