slim3、Google App Engine for Java 1.3.6 で Blobstore API

Google App Engine/Java (以下 GAE/J) のBlobstore APIについて調べています。

環境はSlim3 (1.0.5) + Velocity + app engine sdkは1.3.6です。

 


Blobstore概要

まずはドキュメントを見てみます。

  • 最大2GBのデータオブジェクトを扱える
  • アプリケーションから直接Blobを作成、保存する事は出来ない
  • ここでいうBlobはBlobstoreはDatastoreのblobプロパティとは関係ない
  • Blobの削除は出来る
  • Blobの更新は出来ない
  • Blobの作成は基本的にユーザがブラウザからBlobstoreにPOST(アップロード)する
  • ImageServiceの#getServingUrl(BlogKey)でURLを取得できる(ブラウザで見られる)
  • アプリケーションからBlobの取得は制限されているが方法はある
  • Blob保存と同時にDatastoreにBlobInfoエンティティが保存されるらしい
  • 管理コンソールのDatastore ViewerではBlobInfoエンティティは見えない。

    (Blob Viewerで見えるのが多分ソレ)

要するにBlobstoreは、文字中心のDatastoreとは別に、ビデオとか画像などの大容量ファイルをストアするためのものです。

BlobstoreはGAEと連携可能な画像サーバが使える様なイメージで考えてよいと思います。

Picasaのインフラを使っている様で、個人的には予想どおりで嬉しいです。

GAEからGoogleアカウントのPicasaデータを出し入れ出来る様になる日が来ると予想&期待して待っています。

 


アップロード

基本的にformでPOSTするだけです。

ただ、actionに指定するURLを、BlobstoreServiceの#getBlobUploadUrl(戻りURL)で生成する必要があります。

サンプルコードは擬似的にVTLで書いたものです。

実際にはactionのURLはこのページのController側で生成しておくとかします。

#set($returnUrl="/path/to/return/url")
<form action="$BlobstoreService.getBlobUploadUrl($returnUrl)" method="post" enctype="multipart/form-data">
    <input type="file" name="myImage">
    <input type="submit" value="Submit">
</form>

 


戻りURLのコントローラ

アップロードしたままでは、後でアプリケーションからBlobstoreのBlobを探せません。

Blobのキーを取得し、Datastoreとかに保存しておく必要があると思います。

なので先述のアップロードの際に指定する戻りURLに該当するコントローラを作成します。

先述の例にあわせると path.to.return.UrlController.javaって事になります。

こんな感じでしょうか。

public Navigation run() throws Exception {
    ...
    HttpServletRequest request = RequestLocator.get()
    // ControllerクラスのFieldにrequestがセットされているので上の行は不要です。
    // ひがやすをさんご指摘有難う御座いました。

    BlobstoreService service = BlobstoreServiceFactory.getBlobstoreService();  
    Map<string , BlobKey> blobs = service.getUploadedBlobs(request);  
    BlobKey blobKey = blobs.get("myImage");  
    String keyString = blobKey.getKeyString();
    ....
    keyStringをなんかのEntityにセットしDatastoreに保存
</string>

 


BlobInfoの取得

Blobのキーさえ後で判れば、いつでもアプリケーションで BlobInfo を取得できます。

管理コンソールのBlob Viewerでも参照できます。

BlobInfoはBlobKey、FileName、Content Type、Size、CreationDate等を保持しています。

BlobInfoFactory factory = new BlobInfoFactory();  
BlobInfo blobInfo = factory.loadBlobInfo(blobKey);  

 


Billingの設定

ここまではローカルでテストできますが、画像閲覧とかは本番環境にデプロイしないと出来ませんでした。

で、本番でBlobstore APIを使うには、課金を有効にする必要があるようです。

そういえばやっていませんでした。

わたしは以前Picasaの有料ユーザになった事もあり既にGoogle Checkoutのアカウントがありましたので簡単でしたが、初めての場合は多分クレジットカード番号の入力とかが必要です。

課金を有効にしたからといって、Quotaを超えなければ課金されない(はず)です。

しらないウチにアクセスが集中したりして課金されるのは嫌なので、Stored Data以外は$0の方向でリソースを割り当てました。

ただBilling Settingは1週間変更できないので、すぐに沢山のデータを登録する予定があるとか、既に公開しているサービスの場合とかは、Unit Costは考えて入れた方がいいかもしれません。

 


コントローラで画像閲覧(画像のURL取得)

SDK 1.3.6から、画像URLが簡単に取得出来る様になったようです。

こんな感じです。

public Navigation run() throws Exception {
    ...
    ImagesService imagesService = ImagesServiceFactory.getImagesService();
    String url = imagesService.getServingUrl(blobKey);
    return redirect(url);
}

私の環境ではURLはこんなんでした。

http://lh4.ggpht.com/XXXXXXXXXXXX

URLをブラウザで見てみると、faviconが思いっきりPicasaのソレでした。

詳しくは、Images Java API のドキュメントか、ImageServiceのJavaDocを見てください。

今日はコレくらいにします。

 


参考サイト、Blobstoreの先人の知恵

Google App Engine Blog: Multi-tenancy Support, High Performance Image Serving, Increased Datastor…

今は昔のkonjak翻訳 φ(・ω・? )…: The Blobstore Java API

Song of Cloud: AppEngine1.3.0 Blobstore API入門

App Engine 1.3.0 とBlobstore – hidemonの日記

cochica – slideshare

Images APIの制約について – Google-App-Engine-Japan | Google グループ

Song of Cloud: Blobstoreのデータをアプリケーションで利用する