前回のストレージサービスをさらに修正してみた。主にメタデータについてどのように取り扱うか書いてみる。
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データの取り扱いもできるようになった。
次回は、テーブルについて記載ができたらいいな...


コメントする