调用UploadFromStream默认覆盖文件 - 我如何确保只上传一个blob,如果它尚未在容器中?如何在不覆盖的情况下上传到Azure Blob存储?
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
blockBlob.UploadFromStream(stream)
调用UploadFromStream默认覆盖文件 - 我如何确保只上传一个blob,如果它尚未在容器中?如何在不覆盖的情况下上传到Azure Blob存储?
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
blockBlob.UploadFromStream(stream)
增加接入条件的代码,以便它检查对BLOB的ETag属性 - 允许使用通配符,因此,我们希望只允许上传,如果用这个名字没有斑点有任何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;
}
您还可以检查是否存在斑点,然后上传,像这样:
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
if (!blockBlob.Exists())
{
blockBlob.UploadFromStream(stream)
}
如果你没有一个已存在的方法,看看这个答案Checking if a blob exists in Azure Storage。
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;
}
天青现在有一个接入条件只会增加,不会覆盖:AccessCondition.GenerateIfNotExistsCondition()
定义:
的构建访问条件,以便仅在资源不存在时才会执行操作。
例子:
var accessCondition = AccessCondition.GenerateIfNotExistsCondition();
blockBlob.UploadFromStream(stream, accessCondition);
据我了解,这可能不是,如果你有多个客户端访问容器的工作 - 为斑点可能是由不同的线程/系统/客户端该线程的'之间创建存在'和上传语句。在许多客户端环境中使用Exists解决方案之前,您可能需要测试此场景。 – 2013-06-07 21:30:40