Подтвердить что ты не робот

Как загрузить в хранилище Azure Blob без перезаписи?

Вызов UploadFromStream перезаписывает файлы по умолчанию - как я могу убедиться, что я загружаю только blob, если он еще не находится в контейнере?

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

Ответ 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.