SHOEISHA iD

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

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

Windows Azureで作成するアプリケーションの基礎

Windows Azure Storageを利用したアプリケーションの作成(後編)

Windows Azureで作成するアプリケーションの基礎(4)

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

サンプルの実装

 ここまでで、REST APIの使い方について大まかに理解できたと思います。ここからは、サンプルの実装について、実際の作成の流れに沿って説明していきます。コードの詳細については、サンプルコードを参照してください。

[1]新しいプロジェクトを作成する

 メニューの[ファイル]‐[新しいプロジェクト]を選択し、「AzureStorageSample」という名前でプロジェクトを作成してください。[プロジェクトの種類]は「Visual C#」の中にある「Cloud Service」を、[テンプレート]は(今回はWebロールのみ作成しますので)「Web Cloud Service」を選択してください。

[2]Default.aspxにコントロールを配置する

 Default.aspxにコントロールを配置します。FileUploadコントロール(※1)、タイトル入力用TextBoxコントロール(※2)、アップロード用Buttonコントロール(※3)、画像一覧表示用としてDataListコントロール(※4)を配置します。

Default.aspxのデザイン画面
Default.aspxのデザイン画面

[3]アップロード用ボタンのClickイベントハンドラを実装する

 配置したアップロード用ボタンのClickイベントのハンドラを、次のような流れで実装します。

[リスト5]Clickイベントハンドラ(Default.aspx.cs)
protected void UploadButton_Click(object sender, EventArgs e)
{
    if (!FileUpload1.HasFile)
        return;

    if (TextBox1.Text.Trim() == String.Empty)
        return;

    //コンテナを作成
    CreateContainer();  // ※1

    //ブロブを登録
    PutBlob();  // ※2

    // 画像を再表示
    Display();  // ※3

    TextBox1.Text = String.Empty;
}

 コントロールの入力値をチェックした後、(未作成であれば)コンテナを作成します(※1)。次に、アップロードされた画像データを、Windows Azure Storageのブロブストレージに登録します(※2)。最後に、ブロブストレージから登録済の画像データを取得し、画面に再表示します(※3)。

[4]ブロブストレージへのアクセス処理を実装する

 ブロブストレージに対して、コンテナの作成、ブロブの列挙、ブロブの登録、ブロブの取得、メタデータの取得を行うコードを実装していきます。

 BlobStorageUtilityクラスの、CreateContainerRequest(コンテナの作成、REST APIのCreate Container)、ListBlobsRequest(ブロブの列挙、List Blobs)、PutBlobRequest(ブロブの登録、Put Blob)、GetBlobRequest(ブロブの取得、Get Blob)、GetBlobMetadataRequest(メタデータの取得、Get Blob Metadata)の各メソッドが、REST APIの仕様に基づいてHTTPリクエストオブジェクトを作成します。

 ここでは、そのうちの一つである、ブロブの登録用のHTTPリクエストオブジェクトを作成するPutBlobRequestメソッドのコードを、詳しく見てみます。

 このPutBlobRequestメソッドは、REST APIリファレンス中のBlob Service APIにあるPut Blobの仕様に基づいています。Put Blobは、ブロブを新規作成するか既存のブロブを更新するためのAPIです。なお、更新の場合は、既存のメタデータも含めてすべて上書きされてしまいます。部分的な更新はサポートされていません。

 仕様の詳細は、msdnの「Put Blob」をご覧ください。

[リスト 6]PutBlobRequestメソッド(BlobStorageUtility.cs)
/// <summary>
/// ブロブ登録用HTTPリクエストを作成します。
/// </summary>
/// <param name="postedFile">アップロードされたファイル</param>
/// <param name="title">画像タイトル</param>
/// <returns>HttpWebRequestオブジェクト</returns>
public static HttpWebRequest PutBlobRequest(HttpPostedFile postedFile, string title)
{
    // ……コメント省略……

    HttpWebRequest request = null;

    // リクエストURIを作成
    Uri uri = new Uri(BlobStorageUtility.ContainerUriString() +
        "/" + postedFile.FileName);  // ※1

    // HTTPリクエストを作成
    request = (HttpWebRequest)WebRequest.Create(uri);  // ※2

    request.Method = "PUT";
    request.ContentLength = postedFile.ContentLength;
    request.ContentType = postedFile.ContentType;

    // x-ms-dateヘッダーを追加
    string dateString = DateTime.UtcNow.ToString("R",
        CultureInfo.InvariantCulture);
    request.Headers.Add("x-ms-date", dateString);

    // x-ms-meta-titleヘッダーを追加(メタデータとしてタイトル情報を追加)
    request.Headers.Add("x-ms-meta-title", HttpUtility.UrlEncode(title));  // ※3

    // Authorizationヘッダーを追加
    // ・・・処理省略・・・
    BlobStorageUtility.AddtAuthorizationHeader(
        ref request, authorizationString);  // ※4

    // アップロードファイルをバイト配列に読み込む
    int contentLength = postedFile.ContentLength;
    Byte[] contentBuffer = new Byte[postedFile.ContentLength];
    using (Stream inputStream = postedFile.InputStream)
    {
        inputStream.Read(contentBuffer, 0, contentLength);
    }

    using (Stream requestStream = request.GetRequestStream())
    {
        // HTTPリクエストのストリームに、アップロードファイルの内容を書き込む
        requestStream.Write(contentBuffer, 0, contentLength);  // ※5
        requestStream.Close();
    }

    return request;
}

 まず、リクエストURIを作成します(※1)。先程説明した、ContainerUriStringメソッドで環境に応じた有効なURIが返ってきます。取得したURIに基づいて、HTTPリクエストオブジェクトを作成します(※2)。

 次に、Put Blobの仕様に基づき、HTTPリクエストオブジェクトのプロパティを設定していきます。タイトル情報をメタデータとして追加したり(※3)、Authorization(認証)ヘッダーの登録を行います(※4)。

 最後に、HTTPリクエストオブジェクトのストリームにアップロードファイルの内容を書き込み(※5)、完成したブロブ登録用のHTTPリクエストオブジェクトを返します。実際のリクエストは、呼び出し元のDefault.aspx.csのPutBlobメソッドで行います。

 ここでは省略しますが、コンテナの作成、ブロブリストの取得、ブロブの取得、メタデータの取得についても、REST APIの仕様に基づき同じような方法で行っています。詳細については、サンプルコードを参照してください。

まとめ

 前回、今回と2回にわたって、Windows AzureのストレージサービスであるWindows Azure Storageについて扱いました。また、REST APIを使用してブロブストレージにアクセスするサンプルを作成しました。Windows Azure Storageを用いたアプリケーション作成のイメージがつかめたのではないかと思います。

 次回は、Live Servicesの概要とLive Meshを使ったアプリケーションについて、扱いたいと思います。次回をお楽しみに。

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

  • 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プロジェクト 土井 毅(ドイ ツヨシ)

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング