默认情况下,调用 UploadFromStream 会覆盖文件 - 我如何确保仅上传不在容器中的 blob?
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
blockBlob.UploadFromStream(stream)
默认情况下,调用 UploadFromStream 会覆盖文件 - 我如何确保仅上传不在容器中的 blob?
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
blockBlob.UploadFromStream(stream)
向代码添加访问条件,以便检查 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;
}
Azure 现在有一个只会添加而不是覆盖的访问条件:AccessCondition.GenerateIfNotExistsCondition()
定义:
构造一个访问条件,以便仅当资源不存在时才执行操作。
例子:
var accessCondition = AccessCondition.GenerateIfNotExistsCondition();
blockBlob.UploadFromStream(stream, accessCondition);
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;
}