・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 です<%@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>
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に保存{
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());
}
}
}
しておくと, 後で これをもとに, 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);
}
}
※これでサーブレットの出力となります。画像であれば, ただのシンプルな表示, 動画であれば動画再生用の表示になるはずです。{
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));
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);
BlobKey blobKey = blobs.get("file1"); // file1 とは, blobキーのこと(こんな単純なデータではない)
blobstoreService.delete(blobKey);
0 件のコメント:
コメントを投稿