如何在不覆盖的情况下上传到Azure Blob存储?

Rob*_*rch 19 .net azure azure-storage

默认情况下调用UploadFromStream会覆盖文件 - 如果blob尚未包含在容器中,我如何确保只上传blob?

CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
blockBlob.UploadFromStream(stream)
Run Code Online (Sandbox Code Playgroud)

Rob*_*rch 17

为代码添加一个访问条件,以便它检查blob 的ETag属性 - 允许使用通配符,所以我们只想允许上传,如果没有带有此名称的blob有任何etag(这是一种迂回的说法,是这个blob名称存在).

您将获得StorageException,如下所述.

    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
    try {
        blockBlob.UploadFromStream(stream, accessCondition: AccessCondition.GenerateIfNoneMatchCondition("*"));
    } catch (StorageException ex) {
        if (ex.RequestInformation.HttpStatusCode == (int)System.Net.HttpStatusCode.Conflict) {
            // Handle duplicate blob condition
        }
        throw;
    }     
Run Code Online (Sandbox Code Playgroud)

  • 知道如何使用新的“Azure.Storage.Blobs”包执行此操作吗? (3认同)

Mat*_*obi 9

Azure现在具有只会添加而不是覆盖的访问条件: AccessCondition.GenerateIfNotExistsCondition()

定义:

构造一个访问条件,以便仅在资源不存在时才执行操作.

例:

var accessCondition = AccessCondition.GenerateIfNotExistsCondition();
blockBlob.UploadFromStream(stream, accessCondition);
Run Code Online (Sandbox Code Playgroud)