gae-sdk-1.3 から BlobStore って言うのが追加されてる。 通常の Blob は 1M の制限があるけど Blobstore が 2G までOK。

今時、デジカメの画像データでも 1M 超えるのは普通なので GAE でマルチメディア系のデータを扱おうとすると必須かも。

Blobstore が通常の DataSotre のデータとして扱える訳では なく、全く別のAPIとなる。

Upload用のUIは通常の multipart/form-data を POST する <form> で良い。 但し、POST先のURLは BlobstoreService.createUploadUrl() で得た物になる。 引数には次に記述する制御用 Servlet の URL を指定する。

/blobstore/UI.ssjs:

blobstore = Packages.com.google.appengine.api.blobstore; function doGet(req, res) { var blobstoreService = blobstore.BlobstoreServiceFactory.getBlobstoreService(); var action = blobstoreService.createUploadUrl("/blobstore/loader.ssjs"); var html = <html> <body> <form action={action} method="POST" enctype="multipart/form-data"> pageName:<input type="text" name="pageName" /><br/> file:<input type="file" name="uploadFile" /><br/> <input type="submit" value="保存" /> </form> </body> </html> ; res.setContentType("text/html"); res.writer.write(html); }

Upload/Download自体は GAE がやってくれるがプログラムで制御を 行えるように Servlet が簡単な処理を行う必要がある。 一種のプロキシと考えれば良い。

/blobstore/loader.ssjs:

blobstore = Packages.com.google.appengine.api.blobstore; var blobstoreService = blobstore.BlobstoreServiceFactory.getBlobstoreService(); // Uploader function doPost(req, res) { var props = blobstoreService.getUploadedBlobs(req); var blobKey = props.get("uploadFile"); res.writer.write(blobKey.keyString); //キーの画面表示 } // Downloader function doGet(req, res) { var blobKey = new blobstore.BlobKey(req.getParameter("key")); blobstoreService.serve(blobKey, res); }

準備ができたので早速アクセスしてみる。
何かエラーが出た。

The Blobstore API will be enabled for this application once billing has been enabled in the admin console.
これは、、、お金を払えと言うことでふか、、、( ゚д゚)
まあ、Blobstore を使うと簡単に Quota を超えてしまうので払う用意は しておけって事らしい。
ちょっと迷ったけど上限設定もできるし CARD の登録をしました。 $2/1日が上限です。

billing を有効にして再度アクセスした所、画面が表示されました。

「保存」してみます。
戻り値のキーコードは結構長いです。
AMIfv94E-by9-Y89Ybhm2oT-ER1mCYk8ZiflrHPKHsMEaGiU1zEDAZS_A8HKYC0uZolOYt8SBGatZ0bBWRjm9emBc5mbXBsSjlAyRJj05CSXBSVpHwrzpgq8oC-_QhWx6QKz7anLQb_eVuLINc1VxIttizmU5V8eVg
管理画面から確認してみます。 追加のパラメータ pageName はここには入れてくれないようです。

キーコードを指定して取得してみます。
http://wsjs-gae.appspot.com/blobstore/loader.ssjs?key=AMIfv961S2ndHQ2iypT9YlToo6G0yE0lubFu6BFLxxxr3wupcTO8f2ddvBuSxsZkzQWa7W_Iz-gwci249plRNv9gIwR2hN8QCHbsiz-OXO6QeG-NQkuwZ24uOYdSpCswIvBVbJZCQPz1wtTrRh8FKNe6iourzRSkiQ
ちゃんと取れました。

ストレージの無料は 1G までなので現実的に Blobstore を使いたいような 状況では支払が発生してしまいそうです。
無料と言う GAE の最大のメリットの前提が崩れてしまうので 基本的この機能は使えませんね。残念。
ちなみに billing は速攻で無効にしました (^^;