2011年8月9日火曜日

GAE 画像データのアップロード1 Blobstore編 (お金かかりますけど・・)

GAE(Google App Engine)で画像ファイルをアップロードできないか!?ということでいろいろ調べたことを記載。

GAEではデータ保存用にBlob(Binary Large Object)という型を推奨している。
さらにアップロードようにgae-sdk-1.3 から BlobStoreというBlob専用のデータストアーが使用可能。
これは通常のBigtableで使用されるDataStoreとは別もののよう。

ちなみにサイズ制限は以下のよう。

  • Blob      1M
  • Blobstore  2G
画像データなので大きいほうがいいでしょう、ということでBlobstoreをつかったアップロードについて記載。


方法

以下のGoogleサイト参照。

流れは以下
  1. ファイルアップロード処理記載(BlobstoreServiceFactory使用)
  2. サーバ側でのファイルデータ取得処理

■ファイルアップロード処理記載(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方式は断念だな。。

    1 件のコメント:

    匿名 さんのコメント...

    参考になりました。
    課金設定は必要ですけど、一定量迄は無料です。
    課金設定により、他の条件も多少緩和されるので、GAE使うのであれば課金設定した方がお得なのかもしれません。

    試験結果

    昨日の夜、CGーArtsエンジニアのベーシック、エキスパートの自己採点をした。 実は日曜日には回答が出ていたけど、自信がなく採点するのもやめようかと思っていたがタイミング&勢いでやってしまった。 <結果>  ベーシック:85点  エキスパート:72.5点 70点以上で合格なので...