SiNBLOG

140文字に入らないことを、極稀に書くBlog

Slim3 BlobstoreAPIを使ってみた! Part2

前回に引き続き、Blobstoreです。

今回は更に以下を利用します。

  • FileService
  • AppEngineFile
  • ImageService

FileServiceとAppEngineFileを使えば、BlobstoreへのFileUploadを、redirectせずに行うことができます。
また、サーバ側で作成したファイルをBlobstoreにUploadすることも可能です。

UploadController


public class UploadController extends Controller {

private UploadFileService uploadFileService = new UploadFileService();

@Override
public Navigation run() throws Exception {
FileItem fileItem = requestScope("uploadFile");
FileService fileService = FileServiceFactory.getFileService();
AppEngineFile blobFile =
fileService.createNewBlobFile(fileItem.getContentType());
FileWriteChannel writeChannel =
fileService.openWriteChannel(blobFile, true);
writeChannel.write(ByteBuffer.wrap(fileItem.getData()));
writeChannel.closeFinally();
BlobKey blobKey = fileService.getBlobKey(blobFile);
uploadFileService.entry(blobKey, fileItem.getFileName());
return redirect(basePath);
}
}

IndexControllerでは、特に何もしていなので、とりあえず割愛します。
UploadControllerは、Postされたファイルを受け取っているControllerです。
ここで、Blobstoreへ書き込みを行なっています。
また、FileService.getBlobKey()でBlobKeyが取得できます。
このBlobKeyをDatastoreなどに保存するのは、前回のエントリーと同じです。

ただ、試していたら少し前回のエントリーのやり方とは違うところがありました。
BlobInfoから取得できる情報が少なくなっていました。
しかも、Local環境と本番環境でまた違う・・・。

Localで取れないもの

  • FileName
  • MD5hash

本番環境で取れないもの

  • FileName

なぜ取れないのかはよく分かりませんが、とりあえず取れない・・・。
まぁ、FileNameはFileItemから取得できるので、Datastoreにはそちらから保存してやれば良さそうです。
上記の例でも、そうするために、FileItem.getFileName()を取得しています。

UploadedFileModel


@Model(schemaVersion = 1)
public class UploadedFile implements Serializable {

private static final long serialVersionUID = 1L;

@Attribute(primaryKey = true)
private Key key;

@Attribute(version = true)
private Long version;

private String blobKey;

private String filename;

private String contentType;

private Long size;

private Date creation;

private String md5Hash;

....

public String getImageURL() {
BlobKey blobKey = new BlobKey(this.blobKey);
ImagesService imagesService = ImagesServiceFactory.getImagesService();
return imagesService.getServingUrl(blobKey);
}
}

モデルも前回のエントリーを使い回しているのですが、ここでImageServiceを利用しています。
ImageServiceを利用すると、Blobstoreに保存した画像ファイルのURLを取得することができます。
また、前回のBlobstoreService.serve()では、Outgoing Bandwidthがかかり、1GBを超えると課金が発生します。
しかし、ImageServiceを利用した場合は、Outgoing Bandwidthではなく、Incoming Bandwidthがかかります。
こちらも無料枠は1GBまでですが、課金設定を行うと制限無く利用できます
そのため、画像を扱うのであれば、圧倒的にこちらの方が良さそうです。
それだけではなく、画像の反転などもできるようなので、試してみると良いと思います。
http://code.google.com/intl/en/appengine/docs/java/images/overview.html

以上で、Blobstoreに関する内容は終わりです。
後、Google Cloud Storageも試してみようと思ったのですが、課金設定をしないと使えないようなので、ひとまず断念・・・。

今回のソースはこちら!
UploadController
Google Code Archive - Long-term storage for Google Code Project Hosting.
UploadedFileModel
Google Code Archive - Long-term storage for Google Code Project Hosting.
UploadFileService
Google Code Archive - Long-term storage for Google Code Project Hosting.
index.jsp
Google Code Archive - Long-term storage for Google Code Project Hosting.