Windows Azure 体験3

| コメント(0) | トラックバック(0) このエントリーを含むはてなブックマーク

前回のストレージサービスをさらに修正してみた。主にメタデータについてどのように取り扱うか書いてみる。

Metadata

BLOBなどにはメタデータを保存でき、登録したBLOBに情報を付加できる。 実際に、Microsoftのクラウドコンピューティング Windows Azure入門でも、 画像タイトルをMetadataに保存している

はまった点/Metadata を取得できない

メタデータの保存は以下のようにした。

    var uniqBlobName = string.Format("img_{0}_{1}.jpg",
        DateTime.UtcNow.ToString("yyyyMMddHHmmss"),
        Guid.NewGuid().ToString());
    var container = blobStorage.GetContainerReference(@"photo");
    var block = container.GetBlockBlobReference(uniqBlobName);
    block.Metadata["title"] = TitleTextBox.Text;
    block.UploadFromStream(FileUpload1.FileContent);
 
 

表示できないメタデータ

    var container = blobStorage.GetContainerReference(@"photo");
    thumbnails.DataSource = from o in container.ListBlobs()
                            select new { Url = o.Uri,Title = o.Metadata["title"] };
    thumbnails.DataBind();
 
 

上記のコードはコンパイルが通らなかった。以下のように、.OfType<CloudBlob>()を付け コンパイルを通るようにした。

    var container = blobStorage.GetContainerReference(@"photo");
    thumbnails.DataSource = from o in container.ListBlobs().OfType<CloudBlob>()
                            select new { Url = o.Uri,Title = o.Metadata["title"] };
    thumbnails.DataBind();
 
 

しかし、titleが取得できない。

Metadataを表示

Metadataを取得するためには、FetchAttributes()を呼ぶ必要がある。 MetadataはHTTPのヘッダ経由で取得できるらしく、FetchAttributesを呼び出さないと この値が取得できないようである。

    var container = blobStorage.GetContainerReference(@"photo");
    var blobs = container.ListBlobs().OfType<CloudBlob>().ToList();
    blobs.ForEach(blob => blob.FetchAttributes());
    thumbnails.DataSource = from o in blobs
                          select new
                          {
                              Url = o.Uri,
                              Title = o.Metadata["title"]
                          };
    thumbnails.DataBind();
 
 

上記のように、各blobに対してFetchAttributes()を呼び出すと無事表示できるようになった。

はまった点/表示できない日本語

タイトルに日本語を入れると表示できない。

調べてみると、Metadataには日本語文字列を入れてはいけないようである。 何とかして、日本語を排除ということで、UTF-7 へ変換して設定してみる。

登録部分

    var uniqBlobName = string.Format("img_{0}_{1}.jpg",
        DateTime.UtcNow.ToString("yyyyMMddHHmmss"),
        Guid.NewGuid().ToString());
    var container = blobStorage.GetContainerReference(@"photo");
    var block = container.GetBlockBlobReference(uniqBlobName);
    var bytes = System.Text.Encoding.UTF7.GetBytes(TitleTextBox.Text);
    block.Metadata["title"] = System.Text.Encoding.ASCII.GetString(bytes);
    block.UploadFromStream(FileUpload1.FileContent);
 
 

登録部分で、System.Text.Encoding.UTF7を用いて設定した。

取得部分

また、取得部分で以下のようにした。

    var container = blobStorage.GetContainerReference(@"photo");
    var blobs = container.ListBlobs().OfType<CloudBlob>().ToList();
    blobs.ForEach(blob => blob.FetchAttributes());
    thumbnails.DataSource = from o in blobs
                          select new
                          {
                              Url = o.Uri,
                              Title = System.Text.Encoding.UTF7.GetString(System.Text.Encoding.ASCII.GetBytes(o.Metadata["title"]))
                          };
    thumbnails.DataBind();
 
 

さいごに

ようやくMetaデータの取り扱いもできるようになった。

次回は、テーブルについて記載ができたらいいな...

参考書籍

トラックバック(0)

トラックバックURL: http://www.m-tea.info/mt-tb.cgi/43

コメントする

あわせて読みたいブログパーツ

このブログ記事について

このページは、k1ha410が2009年12月16日 01:45に書いたブログ記事です。

ひとつ前のブログ記事は「メッセージ用Queueに求められるもの」です。

次のブログ記事は「Azure Storage の BLOBオブジェクトの MetaData に日本語を格納」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。