BLOB一覧の取得
ファイルのアップロードが完了すると、BLOB一覧画面(http://localhost/list)にリダイレクトされます。リスト11とリスト12は、BLOB一覧画面の処理です。
// BLOB一覧 app.get('/list', routes.listblobs);
exports.listblobs = function(req, res) { //(1)BLOBの一覧取得 blob.client.listBlobs(BLOB.CONTAINER, function(err, blobs) { res.render('list.ejs', { title : 'BLOB一覧', blobs : blobs}); }); };
(1)のlistBlobsメソッドは指定したコンテナは配下のBLOB一覧を取得します。BLOBの一覧は第2引数のblobs変数に配列として代入されるので、テンプレート側で一覧を表示しています(リスト13)。
<% for (var i = 0; i < blobs.length; i++) { %> <tr> <td><%= i+1 %></td> <td><a href="<%= blobs[i].url %>"><%= blobs[i].name %></a></td> <td><form action="info/<%= blobs[i].name %>" method="get"> <input type="submit" value="情報"></form></td> <td><form action="delete/<%= blobs[i].name %>" method="post"> <input type="submit" value="削除"></form></td> </tr> <% } %>
blobs変数blobsが配列として渡されるので、アップロードしたBLOBへのURLと、BLOB名を表示しています。
BLOBの削除
一覧画面の[削除]ボタンを押すと、http://localhost/delete/BLOB名でPOST処理が行われます(リスト14、リスト15)。
// BLOBの削除 app.post('/delete/:id', routes.deleteblob);
exports.deleteblob = function(req, res) { var blobName = req.params.id; // BLOBの削除 blob.client.deleteBlob(BLOB.CONTAINER, blobName, function(err) { res.redirect('/list'); }); };
app.postの第2引数に指定された、「:id」はプレースホルダとして利用されreq.params.idに紐を付けられます。その情報を元に、指定されたBLOBをdeleteBlobメソッドで削除しています。
BLOBプロパティ情報の取得
一覧画面の[情報]ボタンを押すと、http://localhost/info/BLOB名でGET処理が行われます(リスト16、リスト17)。
// BLOBのプロパティ app.get('/info/:id', routes.information);
exports.information = function(req, res) { var blobName = req.params.id; blob.client.getBlobProperties(BLOB.CONTAINER, blobName, function(err, blob, response) { res.write(util.inspect(blob)); res.end(); }); };
削除処理と同様にURLに指定されたBLOB名を元にgetBlobPropertiesメソッドでBLOBのプロパティ情報を取得しています。図2では、メタデータとして設定した「onwer : 投稿者」が確認できるでしょう。
現在のところAzure SDK for Node.jsのAPIリファレンスは未整備です。したがってAPIの詳細を確認するには、ソースを参照するのが一番確実です。
まとめ
少し駆け足ではありましたが、ExpressとAzureストレージの利用方法について理解できたでしょうか。今回の例のようにすべてをNodeで行う必要は無いため、適材適所で組み合わせることによってAzureの利用方法が広がっていくと考えています。