GAE(Google App Engine)で画像ファイルをアップロードできないか!?ということでいろいろ調べたことを記載。
GAEではデータ保存用にBlob(Binary Large Object)という型を推奨している。
さらにアップロードようにgae-sdk-1.3 から BlobStoreというBlob専用のデータストアーが使用可能。
これは通常のBigtableで使用されるDataStoreとは別もののよう。
ちなみにサイズ制限は以下のよう。
画像データなので大きいほうがいいでしょう、ということでBlobstoreをつかったアップロードについて記載。
方法
以下のGoogleサイト参照。
流れは以下
- ファイルアップロード処理記載(BlobstoreServiceFactory使用)
- サーバ側でのファイルデータ取得処理
■ファイルアップロード処理記載(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 {
Map blobs = 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方式は断念だな。。