2012年1月15日日曜日

Google App Engine(画像 その2 Blobstore)

・BlobStoreの利用
・admin ツールで動作チェック
・Blobデータのupload(JSPサイド)
・Blobデータの保存(Servlet)
・Blobデータの表示(Servlet)
・Blobデータの加工(Servlet)
・Blobの削除

※プログラムは動作チェックはしていますが, 細かい設定などは載せていません。

●BlobStoreの利用
- 1MBを超えるバイナリデータは, 通常の データストア Blob 型に保存しようとすると, エラーが出る
com.google.apphosting.api.ApiProxy$RequestTooLargeException
- 2GBまでの, データなら BlobStoreを利用する
- BlobStoreには, key, value のみになる
- BlobStore保存データの表示は, BlobstoreService.serve() を利用する

●admin ツールで動作チェック
BlobStoreに保存したデータは, 以下のようにチェックします
http://localhost/_ah/admin にアクセス
DataStoreViewer の __BlobInfo__ で参照, 削除ができます。



●Blobデータのupload(JSPサイド)
このプログラムは, 公式サイトでも載っています。
ex) JSP
<%@page language="java" contentType="text/html charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="com.google.apengine.api.blobstore.*" %>
<% BlobstoreService blobStoreService = BlobstoreServiceFactory.getBlobstoreService(); %>
<html>
<head>
</head>
<body>
    <form action="<%= blobstoreService.createUploadUrl("/upload") %>" method="post" enctype="multipart/form-data">
        <input type="file" name="myFile">
        <input type="submit" value="Submit">
    </form>
</body>
</html>

※ BlobstoreService を利用します   /upload のところは action の mapping です
type = "file"  name="myFile"    name属性は必要です, サーブレット側で利用します

●Blobデータの保存(Servlet)

public class Upload extends HttpServlet
{
private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();

public void doPost(HttpServletRequest req, HttpServletResponse resp )
{
Map<String, BlobKey>  blobs = blobstoreService.getUploadedBlobs(req);
BlobKey blobKey = blobs.get("myFile");   // type="file"の name
if ( blobKey == null )
{
// 失敗
resp.sendRedirect("/");
}
else
{
// 表示には, 別のサーブレットが必要
res.sendRedirect("/serve?blob-key=" + blobKey.getkeyString());
}
}
}

※ Map データですね。 これで, 保存完了です。 実際には, BlobKey の キーを, datastoreに保存
しておくと, 後で これをもとに, BlobKeyを取得できます。

●Blobデータの表示(Servlet)
ここが問題, どうやら, 加工して好き放題表示を作ることができない模様(まだ試していませんが)
先ほどのキーをもとに,  BlobKey クラスのインスタンスを取り出し, BlobstoreService .serve() を使って表示をつくります。

public class Serve extends HttpServlet
{
private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();

public void doGet( HttpServletRequest req, HttpServletResponse resp )
{
BlobKey blobKey = new BlobKey(req.getParameter("blob-key"));
blobstoreService.serve(blobKey, resp);
}
}
※これでサーブレットの出力となります。画像であれば, ただのシンプルな表示, 動画であれば動画再生用の表示になるはずです。

●Blobデータの加工(Servlet)
BlobKey bKey = new BlobKey("キー");
ImagesService service = ImagesServiceFactory.getImagesService();
Transform trans = ImagesServiceFactory.makeResize(100,150);
Image newImage = service.applyTransform(trans, ImagesServiceFactory.makeImageFromBlob(bKey));

※リサイズは, 縦横比を維持するので幅高さどちらかに合うことになります
※たとえ, BlobStoreのデータが, 1MBをこえていてもこれならImage を取り出せます

●Blob データの削除
キーを使って, BlobKeyのインスタンスをつくり, それをもとに, serviceのdeleteで削除
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
BlobKey blobKey = blobs.get("file1");   // file1 とは, blobキーのこと(こんな単純なデータではない)
blobstoreService.delete(blobKey);



0 件のコメント:

コメントを投稿