Как загрузить в хранилище Azure Blob без перезаписи?
Вызов UploadFromStream перезаписывает файлы по умолчанию - как я могу убедиться, что я загружаю только blob, если он еще не находится в контейнере?
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
blockBlob.UploadFromStream(stream)
Ответы
Ответ 1
Добавьте условие доступа к коду, чтобы оно было проверено на ETag свойство шаблонов blob - разрешено, поэтому мы хотите только разрешить загрузку, если никакие капли с этим именем не имеют никакого этага (это круговой способ сказать, имеет ли это имя 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;
}
Ответ 2
Ответ, предоставленный Роб-Церктом, выглядит нормально. Проверка строк для ошибок не является лучшей практикой и может быть улучшена с помощью:
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;
}
Ответ 3
Теперь у Azure есть условие доступа, которое будет добавлять, а не перезаписывать: AccessCondition.GenerateIfNotExistsCondition()
Определение:
Создает условие доступа, так что операция будет выполняться только в том случае, если ресурс не существует.
Пример:
var accessCondition = AccessCondition.GenerateIfNotExistsCondition();
blockBlob.UploadFromStream(stream, accessCondition);
Ответ 4
Вы также можете проверить, существует ли blob и затем загружаться, например:
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
if (!blockBlob.Exists())
{
blockBlob.UploadFromStream(stream)
}
Если у вас нет метода Exists, проверьте этот ответ Проверка наличия blob в Azure Storage.