AzureBlobStorage.UploadBlobAsync の注意点
AzureBlobStorage.UploadBlobAsync
ですが、公式ドキュメントでは以下のように記載があります。
このメソッドは、BLOB がまだ存在しない場合は作成し、既に存在する場合は上書きします。
と言うことで以下のコードを書きました。
var container = new BlobContainerClient(connectionString, containerName);
var stream = File.OpenRead(path);
// BLOB が存在してたら上書きされるはず
container.UploadBlobAsync(uploadPath, stream)
.ContinueWith(result => {
stream.Dispose();
if (!!result.IsCompletedSuccessfully) {
// 成功時の処理
} else {
// 失敗時の処理
}
});
これはよくある日本語に翻訳する際の間違いです。
上書きされずにステータスには Faulted
が返ります。
英語版では以下のように記載がありました。
A RequestFailedException will be thrown if the blob already exists. To overwrite an existing block blob, get a BlobClient by calling GetBlobClient(String), and then call Upload(Stream, Boolean, CancellationToken) with the override parameter set to true.
BLOB がすでに存在する場合は、RequestFailedExceptionがスローされます。既存のブロック BLOB を上書きするには、GetBlobClient(String) を呼び出して BlobClient を取得し、override パラメータを true に設定して Upload(Stream, Boolean, CancellationToken) を呼び出します。
上書きしたい場合は AzureBlobStorage.UploadBlobAsync
ではなく BlobClient.Upload
を使いなさいと言うことです。
と言うことで以下のコードに書き換えました。
var container = new BlobContainerClient(connectionString, containerName);
var stream = File.OpenRead(path);
// BLOB が存在してたら上書きしたい場合は BlobClient の UploadAsync を利用する
var client = container.GetBlobClient(uploadPath);
client.UploadAsync(stream, true)
.ContinueWith(result => {
stream.Dispose();
if (!!result.IsCompletedSuccessfully) {
// 成功時の処理
} else {
// 失敗時の処理
}
});
まぁ、ドキュメントは公式とは言っても元ソースを参照しないといけないと言うことです。