GAEではデータ保存用にBlob(Binary Large Object)という型を推奨している。
さらにアップロードようにgae-sdk-1.3 から BlobStoreというBlob専用のデータストアーが使用可能。
これは通常のBigtableで使用されるDataStoreとは別もののよう。
ちなみにサイズ制限は以下のよう。
- Blob 1M
- Blobstore 2G
画像データなので大きいほうがいいでしょう、ということでBlobstoreをつかったアップロードについて記載。
方法
以下のGoogleサイト参照。
流れは以下
- ファイルアップロード処理記載(BlobstoreServiceFactory使用)
- サーバ側でのファイルデータ取得処理
ファイルをアップロードする処理のポイント
- BlobstoreServiceFactoryでblobstore用のURL生成
- アップロードformの属性にenctype="multipart/form-data"指定
まずはBlobStoreはDataStoreとは別管理のデータベース、と捉えると当然その保存先のURLを取得する必要がある訳で、そういう意味でURLを生成する必要あり。
後はそのURLを指定してファイルアップロードに必要なmultipart属性を指定すればOK。
<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %> <%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %> <% BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); String uploadUrl = blobstoreService.createUploadUrl("/upload"); %>
■サーバ側でのファイルデータ取得処理
サーバ側でのファイルデータ処理のポイント
- BlobstoreServiceでrequestからBlobKey取得
- BlobKeyを使ってresponseにserve
サーバ側の処理としては、requestデータから格納されたはずのBlobStoreにアクセスするためのBlobKeyを取得し、そのキーでを用いてBlobStoreに格納されたデータにアクセスする。
responseデータに画像を表示するにはBlobstoreServiceのserveというメソッドを使用すれば可能。
@SuppressWarnings("serial") public class UploadServlet extends HttpServlet { private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { Mapblobs = blobstoreService.getUploadedBlobs(req); BlobKey blobKey = blobs.get("file1"); if (blobKey == null) { resp.sendRedirect("/"); } else { resp.sendRedirect("/get?blob-key=" + blobKey.getKeyString()); } } public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { BlobKey blobKey = new BlobKey(req.getParameter("blob-key")); blobstoreService.serve(blobKey, resp); } }
以下はweb.xmlの抜粋
UploadServlet com.kekenzy.gae.test.UploadServlet UploadServlet /upload GetServlet com.kekenzy.gae.test.UploadServlet GetServlet /get
問題発生!!
とりあえず、ローカルで確認し選択したファイルがアップロードされ表示されることは確認
で、GAEにデプロイしたあといざアクセスすると、画面に以下のエラーが表示。。
Uncaught exception from servlet
com.google.apphosting.api.ApiProxy$FeatureNotEnabledException: The Blobstore API will be enabled for this application once billing has been enabled in the admin console.
billingってことは課金!?ってので、一応検索するとやはり課金設定して「金はらえ」ってことみたい。。。
なんてこった・・・
まー確かに画像データをガンガン上げられればサーバ圧迫するから仕方ないか。。
とりあえずお金かけない方式!でサービス作りたいのでBlobstore方式は断念だな。。
1 件のコメント:
参考になりました。
課金設定は必要ですけど、一定量迄は無料です。
課金設定により、他の条件も多少緩和されるので、GAE使うのであれば課金設定した方がお得なのかもしれません。
コメントを投稿