Google App Engine でのファイルアップロード ~ ブロブキーの取得

Blob = アップロードファイルはこうして操作する

Google App Engine ではアップロードしたファイルはブロブストア (blobstore) 内に、ファイル一つ一つがブロブ (blob) として格納されるということは、 「Google App Engine でのファイルアップロード」で説明しました。まだ読んでないのでしたら、目を通しておいてください。

さて、createUploadUrl メソッドで取得した URL にファイルをアップロードした後、どのようにファイルを扱えば良いのでしょうか。

ブロブストアサービスではブロブキーを元にブロブそのものを操作できる

ブロブストアサービスでは、文字通りブロブキーをブロブのキーとしてブロブを操作します。 例えば、あるブロブを削除するなら、そのブロブのブロブキーを BlobstoreService の delete メソッドに渡せばよいのです。

ちなみに、ブロブサービスのインスタンスはブロブサービスファクトリ (BlobstoreServiceFactory) の getBlobstoreService メソッドで取得します。

getUploadedBlobs メソッドでブロブキーを取得できる

では、どうやってブロブキーを取得するかというとこれは簡単です。

ファイルをアップロードした後、フォワード先のプログラムでは次のようにすることで、ブロブキーを取得できます。 サーブレットのコード全体を示します。

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.blobstore.BlobstoreService;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;

@SuppressWarnings("serial")
public class FileUploadServlet extends HttpServlet {

     private BlobstoreService blobstoreService
          = BlobstoreServiceFactory.getBlobstoreService();

     public void doPost(
          HttpServletRequest request,
          HttpServletResponse response )
          throws ServletException, IOException {

          Map<String, BlobKey> blobs
               = blobstoreService.getUploadedBlobs(request);
          BlobKey blobKey = blobs.get("file1");

          response.sendRedirect(
               "/blobinfo.jsp?blobkey=" + blobKey.getKeyString());

     }
}

ポイントは次の箇所です。

          Map<String, BlobKey> blobs
               = blobstoreService.getUploadedBlobs(request);
          BlobKey blobKey = blobs.get("file1");

このように getUploadedBlobs メソッドによって、文字列をキーとして BlobKey を値とするコレクション (マップ) を取得できます。 キーは HTML の input タグに記載した name です。

このように簡単にブロブキーが取得できます。

尚、アップロードファイルが画像である場合は、画像サービス (image service)を利用するとブロブから直接画像を提供する URL を取得できたりして便利です。