GAEの画像配信を速くする方法
AppEngineに画像ファイルをアップロードする場合、
DatastoreにBlobとして保存し、表示するときはDatastoreから取り出したデータを
Responseに流し込むことで表示するのが今までのやり方でした。
この表示は非常に遅く、問題でした。
SDK1.3.0で追加されたBlobstore APIを使うと、
http://code.google.com/intl/en/appengine/docs/java/blobstore/overview.html
Picassaのインフラから配信されるらしく非常に高速になるとの事でしたが、
Slim3のasStringが動かない(?)、処理結果は必ずredirectしなければならない(validate情報をforwardできない)、など
既存のアプリに組み込むには苦労がありました。
しかしながら、SDK1.4.3に追加されたFileServiceを使うと(Experimentalだけど)
http://code.google.com/intl/en/appengine/docs/java/blobstore/overview.html#Writing_Files_to_the_Blobstore
プログラムから、直接Blobstoreに画像データを書き込むことができます。
FileItem fileItem = requestScope("image"); 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);
このblobKeyをDatastoreに保存し、表示時には
String imageUrl = imagesService.getServingUrl(blobKey);
のimageUrlを呼びます。
こうする事で、既存のアプリをあまり変更することなく
Blobstoreの高速配信が出来るようになります。
追記
その実例がコチラです。
http://www.zusaar.com/event/agZ6dXNhYXJyDAsSBUV2ZW50GNk2DA