26

默认情况下,调用 UploadFromStream 会覆盖文件 - 我如何确保仅上传不在容器中的 blob?

CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
blockBlob.UploadFromStream(stream)
4

3 回答 3

24

向代码添加访问条件,以便检查 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;
    }     
于 2013-02-18T14:28:42.950 回答
11

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

定义:

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

例子:

var accessCondition = AccessCondition.GenerateIfNotExistsCondition();
blockBlob.UploadFromStream(stream, accessCondition);
于 2017-03-16T21:58:11.010 回答
3

Rob Church 提供的答案似乎还可以。检查字符串是否有错误不是最佳实践,可以通过以下方式改进:

        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;
        }
于 2016-05-03T22:33:38.407 回答