Storage Client Library 1.7 を 最新版(4.3)に移行する際のポイントをまとめます。この記事では、Blob Storage について記載します。それ以外については、記事を分けました。
- Azure Storage Client Library 1.7 を 4.3 に移行する
- Azure Storage Client Library 1.7 を 4.3 に移行する( Table 編 )
- Azure Storage Client Library 1.7 を 4.3 に移行する( Queue 編 )
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 メソッドでサイズを取得してから、ダウンロードします。