LoginSignup
1
0

More than 1 year has passed since last update.

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 {
            // 失敗時の処理
        }
    });

まぁ、ドキュメントは公式とは言っても元ソースを参照しないといけないと言うことです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0