ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure Storage Client Library 1.7 を 4.3 に移行する( Blob 編 )

Storage Client Library 1.7 を 最新版(4.3)に移行する際のポイントをまとめます。この記事では、Blob Storage について記載します。それ以外については、記事を分けました。

Container の作成と削除

#Version 1.7
// Create
var container = blobClient.GetContainerReference("test");
container.CreateIfNotExist();
// Delete
container.Delete();
#Version 4.3
// Create
var container = blobClient.GetContainerReference("test");
await container.CreateIfNotExistsAsync();
// Delete
await container.DeleteIfExistsAsync();

メソッド名が Exists になり、「s」が付加されています。Container の削除時に、事前の存在チェックが必要なくなりました。

Blob の取得(1)

#Version 1.7
var container = blobClient.GetContainerReference("test");
CloudBlob blob = container.GetBlobReference("sample.jpeg");
#Version 4.3
var container = blobClient.GetContainerReference("test");
CloudBlockBlob blob = container.GetBlockBlobReference("sample.jpeg");

CloudBlob が廃止されたので、CloudBlockBlob と CloudPageBlob のどちらかを使います。

Blob の取得(2)

#Version 1.7
CloudBlob blob1 = blobClient.GetBlobReference("http://127.0.0.1:10000/devstoreaccount1/test/sample.jpeg");
CloudBlockBlob blob2 = blobClient.GetBlockBlobReference("http://127.0.0.1:10000/devstoreaccount1/test/sample.jpeg");
#Version 4.3
var container = blobClient.GetContainerReference("test");
CloudBlockBlob blob1 = container.GetBlockBlobReference("sample.jpeg");
CloudBlockBlob blob2 = container.GetBlockBlobReference("sample.jpeg");
// URL を渡してしまうと、間違った Blob が取得されてしまう!
CloudBlockBlob error = container.GetBlockBlobReference("http://127.0.0.1:10000/devstoreaccount1/test/sample.jpeg");

BlobClient から Blob を取得するメソッドが削除されたので、Container から取得します。URL ではなく、BlobName を渡さないと、正しい Blob が取得できません。

Blob の取得(3)

#Version 1.7
var container = blobClient.GetContainerReference("test");
// どちらも正しい Blob を取得できる
CloudBlockBlob blob = container.GetBlockBlobReference("http://127.0.0.1:10000/devstoreaccount1/test/sample.jpeg");
CloudBlockBlob blob2 = container.GetBlockBlobReference("sample.jpeg");
#Version 4.3
var container = blobClient.GetContainerReference("test");
// URL を渡してしまうと、間違った Blob が取得されてしまう!
CloudBlockBlob blob = container.GetBlockBlobReference("http://127.0.0.1:10000/devstoreaccount1/test/sample.jpeg");
// 正しい Blob を取得できる
CloudBlockBlob blob2 = container.GetBlockBlobReference("sample.jpeg");

Version 1.7 では、Container から Blob を取得する際に、URL と BlobName のどちらを渡しても正しい Blob を取得できました。Version 4.3 では、BlobName を渡さないと、正しい Blob が取得できません。

BlobDirectory の取得

#Version 1.7
var container = blobClient.GetContainerReference("test");
// どちらも正しい BlobDirectory を取得できる
var directory1 = container.GetDirectoryReference("http://127.0.0.1:10000/devstoreaccount1/test/directory1/");
var directory2 = container.GetDirectoryReference("directory1/");
#Version 4.3
var container = blobClient.GetContainerReference("test");
// 絶対URL を渡してしまうと、間違った BlobDirectory が取得されてしまう!
var directory1 = container.GetDirectoryReference("http://127.0.0.1:10000/devstoreaccount1/test/directory1/");
// 正しい BlobDirectory を取得できる
var directory2 = container.GetDirectoryReference("directory1/");

Version 1.7 では、絶対URL と 相対URL のどちらを渡しても正しい Directory を取得できました。Version 4.3 では、相対URL を渡さないと、正しい Directory が取得できません。

ListBlob の取得

#Version 1.7
var container = blobClient.GetContainerReference("test");
var directory = container.GetDirectoryReference("directory1/");
var blobs = directory.ListBlobs(new BlobRequestOptions(){UseFlatBlobListing = true});
#Version 4.3
var container = blobClient.GetContainerReference("test");
var directory = container.GetDirectoryReference("directory1/");
var blobs = directory.ListBlobs(true/*useFlatBlobListing*/);

階層化された Blob をフラットに取得する場合は、BlobRequestOptions 型ではなく、bool 型で指定します。CloudBlob が廃止されたので、 ListBlobs() メソッドの戻り値は、 CloudBlockBlob or CloudPageBlob or CloudBlobDirectory のいずれかの型が返却されます。

Blob のコピー

#Version 1.7
var sourceBlob = sourceContainer.GetBlockBlobReference("sample.jpeg");
var targetBlob = targetContainer.GetBlockBlobReference("sample.jpeg");
targetBlob.CopyFromBlob(sourceBlob);
#Version 4.3
var sourceBlob = sourceContainer.GetBlockBlobReference("sample.jpeg");
var targetBlob = targetContainer.GetBlockBlobReference("sample.jpeg");
await targetBlob.StartCopyFromBlobAsync(sourceBlob);

メソッド名に「Start」が付加されています。

Blob のアップロード

#Version 1.7
var container = blobClient.GetContainerReference("test");
var blob = container.GetBlockBlobReference("sample.jpeg");
byte[] content = byteData;
blob.UploadByteArray(content);
#Version 4.3
var container = blobClient.GetContainerReference("test");
var blob = container.GetBlockBlobReference("sample.jpeg");
byte[] content = byteData;
await blob.UploadFromByteArrayAsync(content, 0, content.Length);

メソッド名に「From」が付加され、引数が増えています。

Blob のダウンロード

#Version 1.7
var container = blobClient.GetContainerReference("test");
var blob = container.GetBlockBlobReference("sample.jpeg");
var content = blob.DownloadByteArray();
#Version 4.3
var container = blobClient.GetContainerReference("test");
var blob = container.GetBlockBlobReference("sample.jpeg");
blob.FetchAttributes();
var content = new byte[blob.Properties.Length];
await blob.DownloadToByteArrayAsync(content, 0);

メソッド名に「To」が付加されています。FetchAttributes メソッドでサイズを取得してから、ダウンロードします。