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
モデルも前回のエントリーを使い回しているのですが、ここでImageServiceを利用しています。
@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を利用すると、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.