ストレージの利用
ここからは、サンプルをベースにポイントとなるBLOBの利用方法について解説していきます。本稿のリストではエラー処理を省略していますが、サンプルには実装されています。詳細については、サンプルを参照ください。
ストレージの利用準備
はじめにBLOBストレージを利用するための準備について説明します。
[1]BLOBを操作するクライアントを作成する
Azureライブラリを利用するために、ライブラリの読み込みとBLOBを操作するためのインスタンスを生成する必要があります(リスト7)。
var azure = require('azure'); //(1)Azureモジュールの読み込み var blob = require('./blob.js'); //(2)共有オブジェクト用モジュール //(3)BLOBを操作するクライアントの作成 blob.client = azure.createBlobService( azure.ServiceClient.DEVSTORE_STORAGE_ACCOUNT, azure.ServiceClient.DEVSTORE_STORAGE_ACCESS_KEY, azure.ServiceClient.DEVSTORE_BLOB_HOST);
(1)は、Azureライブラリを利用するために必要なライブラリを読み込んでいます。(2)はBLOBクライアントを共有するためにモジュールを作成して設定しています。
(3)は、BLOBを操作するためインスタンスを作成しています。BLOBを利用するためには通常、アカウント、アクセスキーと呼ばれる2つが必要です。上記の例ではストレージエミュレータをアクセスするために、ストレージエミュレータ用のアカウント、アクセスキーを指定しています(注1)。
環境変数EMULATEDに何らかの文字が定義されている場合は、引数なしでもストレージエミュレータが利用されます。
本番環境のAzureストレージを利用するには、管理ポータルからストレージアカウントの作成が必要です。「T Pro (IT 担当者) のための Windows Azure Platform 運用管理ガイド 1.0」の7.12ストレージサービスの利用と管理を参考にアカウントの作成を行うことによって、アカウントとアクセスキーを入手できます。
[2]BLOBコンテナを作成する
ファイルをアップロードするためにBLOB上にコンテナを作成します(リスト8)。通常のファイルシステムで言うところのフォルダ相当のものですが、ネストすることはできません。ただし、BLOB名にスラッシュ(/)を含めることができるので、擬似的な多重階層構造を取ることができます。
//(1)BLOBコンテナの作成 blob.client.createContainerIfNotExists(blob.CONTAINER, function(err) { //(2)BLOBコンテナのアクセス権を設定 blob.client.setContainerAcl(blob.CONTAINER, azure.Constants.BlobConstants.BlobContainerPublicAccessType.BLOB, function(err) { }); } });
見ていただくと分かるとおり、Node.jsの作法どおり非同期なメソッドしか用意されていません。(1)のcreateContainerIfNotExistsメソッドで作成したいコンテナ名と、コールバック関数を渡しコンテナを作成します。その後、(2)のコールバック関数が呼び出されるため、関数内でコンテナのアクセス権を設定しています。初期値はプライベートアクセス権しか設定されていないので、第三者からのアクセスを許可したい場合はパブリックアクセス権を付与します。
Node.jsで変数を共有するのは少々悩ましい問題で、今回はBLOBクライアントを共有するためにモジュールを使いました。これらの作法については、Node.jsのGoogle Groups上でも議論されていますので、興味がある方は参照ください。
BLOBのアップロード
次にファイルをBLOBにアップロード部分を作成します。リスト9はBLOBアップロード処理のURLルーティングの設定です。
//(1)BLOBのアップロード画面 app.get('/upload', routes.upload); //(2)BLOBアップロード app.post('/uploadtoblob', routes.uploadblob);
(1)は、BLOBのアップロード画面へのルーティング設定で、http://localhost/uploadへブラウザでアクセスするとアップロード画面が図1のように表示されます(注2)。(2)は、フォーム処理から呼び出されるBLOBのアップロード処理へのルーティング設定です。
フォーム定義の詳細は、「view/upload.ejs」を参照ください。
リスト10が、実際のロジックとなります。
//(1)BLOBのアップロード画面 exports.upload = function(req, res) { res.render('upload', { title : 'BLOBアップロード' }); }; //(2)BLOBのアップロード処理 exports.uploadblob = function(req, res) { // フォームデータの取得 var file = req.files.uploadFile; // ファイル情報 var owner = req.body.owner; // 投稿者 // メタデータの設定 var options = { metadata : { owner : owner } }; blob.client.createBlockBlobFromFile(blob.CONTAINER, file.name, file.path, options, function(err) { // アップロード正常終了 res.redirect('/list'); }); };
(1)はBLOBへのアップロードフォームを表示するためにタイトルのみを定義してします。(2)では、アップロード画面のフォームから必要な情報がPOSTされるため、ここでアップロード処理を実装します。フォームデータの取得処理は、Expressフレームワークが処理してくれるため、特別な処理を実装する必要はなく、req変数からフォームに設定されたデータを取り出します。例えば、req.files.uploadFileには、フォームで設定されたファイルの情報が格納されており、req.body.ownerには投稿者に設定した文字列が格納されます。
createBlockBlobFromFileメソッドでBLOBにファイルをアップロードします。引数には順に、コンテナ名、BLOB名、アップロードしたいファイルパス、オプションを指定します。この例では、オプションとしてKey-Value形式で付与可能なメタデータを設定しています。