SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Windows Azure新機能チュートリアル

Windows Azure for Node.jsでAzureストレージを扱おう

Windows Azure 新機能チュートリアル(15)

  • X ポスト
  • このエントリーをはてなブックマークに追加

ストレージの利用

 ここからは、サンプルをベースにポイントとなるBLOBの利用方法について解説していきます。本稿のリストではエラー処理を省略していますが、サンプルには実装されています。詳細については、サンプルを参照ください。

ストレージの利用準備

 はじめにBLOBストレージを利用するための準備について説明します。

[1]BLOBを操作するクライアントを作成する

 Azureライブラリを利用するために、ライブラリの読み込みとBLOBを操作するためのインスタンスを生成する必要があります(リスト7)。

[リスト7]Azureストレージの利用準備(app.js 10行目~)
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)。

注1

 環境変数EMULATEDに何らかの文字が定義されている場合は、引数なしでもストレージエミュレータが利用されます。

補足 本環境のAzureストレージの利用

 本番環境のAzureストレージを利用するには、管理ポータルからストレージアカウントの作成が必要です。「T Pro (IT 担当者) のための Windows Azure Platform 運用管理ガイド 1.0」の7.12ストレージサービスの利用と管理を参考にアカウントの作成を行うことによって、アカウントとアクセスキーを入手できます。

[2]BLOBコンテナを作成する

 ファイルをアップロードするためにBLOB上にコンテナを作成します(リスト8)。通常のファイルシステムで言うところのフォルダ相当のものですが、ネストすることはできません。ただし、BLOB名にスラッシュ(/)を含めることができるので、擬似的な多重階層構造を取ることができます。

[リスト8]BLOBコンテナの作成(app.js 68行目~)
//(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で変数を共有する

 Node.jsで変数を共有するのは少々悩ましい問題で、今回はBLOBクライアントを共有するためにモジュールを使いました。これらの作法については、Node.jsのGoogle Groups上でも議論されていますので、興味がある方は参照ください。

 

BLOBのアップロード

 次にファイルをBLOBにアップロード部分を作成します。リスト9はBLOBアップロード処理のURLルーティングの設定です。

[リスト9]BLOBアップロード(app.js 59行目~)
//(1)BLOBのアップロード画面
app.get('/upload', routes.upload);

//(2)BLOBアップロード
app.post('/uploadtoblob', routes.uploadblob);

 (1)は、BLOBのアップロード画面へのルーティング設定で、http://localhost/uploadへブラウザでアクセスするとアップロード画面が図1のように表示されます(注2)。(2)は、フォーム処理から呼び出されるBLOBのアップロード処理へのルーティング設定です。

注2

 フォーム定義の詳細は、「view/upload.ejs」を参照ください。

 リスト10が、実際のロジックとなります。

[リスト10]BLOBアップロード(app.js 59行目~)
//(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形式で付与可能なメタデータを設定しています。

図2:BLOBアップロード画面
図2:BLOBアップロード画面

次のページ
まとめ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Windows Azure新機能チュートリアル連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト statemachine(statemachine)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6649 2012/07/10 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング