Не перезаписывать хранилище BLOB-объектов Azure

У меня есть метод, который добавляет файлы в хранилище BLOB-объектов Azure, проблема в том, что я пытаюсь указать условие, при котором он НЕ перезаписывает большой двоичный объект, а просто добавляет к нему. Я пытаюсь использовать условие доступа к параметрам, однако VS говорит, что этот метод не может принимать два параметра - async void archiveNewImportedImages (List imageFiles) {

        // Saving the images
        // Retrieve reference to a blob named "myblob".


        // Create or overwrite the "myblob" blob with contents from a local file.

        using (var fileStream = System.IO.File.OpenRead(@"C:\Users\rahulchawla\Desktop\FilezilleIMGS\FilezilleIMGS\MTO_Image\CR01-1-20170623-1327.jpg"))
        {

            await blockBlob.UploadFromStreamAsync(fileStream, accessCondition: AccessCondition.GenerateIfNoneMatchCondition("*"));
        }

        // save url of the image into a variable and later to the database
        ///  fileURL = blockBlob.Uri.ToString();



    }

Какие-либо предложения?

Конечная цель: не перезаписывать контейнер - продолжать добавлять отдельные файлы, например. img1.jpg, img2.jpg в blob

Дополнительные сведения: хотите добавить изображения в контейнер (другими словами, продолжайте добавлять изображения в контейнер). Если файл существует, то не хотелось бы перезаписывать существующий файл)


person rahulchawla    schedule 08.12.2017    source источник
comment
Если я правильно понимаю, вы хотите добавить новый контент в существующий большой двоичный объект, а не перезаписывать его. Я прав? Или вы хотите, чтобы операция завершилась ошибкой, если большой двоичный объект уже существует?   -  person Gaurav Mantri    schedule 08.12.2017
comment
Правильный @GauravMantri - добавить новый контент в существующий blob   -  person rahulchawla    schedule 08.12.2017
comment
Из вашего кода кажется, что вы загружаете изображения. Это будут целевые данные? Потому что в этом случае ваш blob-объект будет поврежден и станет практически бесполезным. Или вы пытаетесь сохранить журналы, в которых вы хотели бы добавить последние данные в существующий большой двоичный объект?   -  person Gaurav Mantri    schedule 08.12.2017
comment
Я в основном хочу использовать хранилище BLOB-объектов в качестве хранилища для изображений, почему оно должно быть повреждено - я буду передавать последние данные, но это будут файлы изображений @GauravMantri   -  person rahulchawla    schedule 08.12.2017
comment
Причина, по которой они могут быть повреждены, заключается в том, что вы хотите добавить новые данные в существующий большой двоичный объект. Допустим, у вас есть изображение с именем image1.png размером 10 КБ в хранилище BLOB-объектов. Теперь вы хотите добавить еще несколько данных только в этот файл. В этом сценарии он будет поврежден. Или я не понимаю вашего варианта использования? В этом случае отредактируйте свой вопрос и включите более подробную информацию о ваших требованиях (пожалуйста, не предоставляйте эти данные в комментариях).   -  person Gaurav Mantri    schedule 08.12.2017
comment
Нет - я хочу продолжать добавлять изображения, например, я обрабатываю изображения и добавляю отдельные изображения в контейнер, НЕ ДОБАВЛЯЮЩИЕСЯ К ФАЙЛУ и не перезаписывая blob @GauravMantri   -  person rahulchawla    schedule 08.12.2017
comment
Ааа ... Итак, вы хотите добавить изображения в контейнер (другими словами, продолжайте добавлять изображения в контейнер). Если файл существует, вы не захотите перезаписывать существующий файл). Может быть, сохранить их под другим именем? Это верно?   -  person Gaurav Mantri    schedule 08.12.2017
comment
Хорошо, не будем превращать это в дискуссионный форум. @rahulchawla - пожалуйста, отредактируйте свой вопрос, чтобы уточнить подробности. Здесь похоронено множество деталей. И снова StackOverflow не предназначен для использования в качестве дискуссионного форума. Это превращается в поток комментариев. Но я почти уверен, что Гаурав правильно определил вашу проблему и ваше непонимание хранилища BLOB-объектов, и должен просто опубликовать ответ сейчас.   -  person David Makogon    schedule 08.12.2017
comment
@GauravMantri Правильно!   -  person rahulchawla    schedule 08.12.2017


Ответы (2)


По умолчанию хранилище BLOB-объектов Azure перезапишет содержимое большого двоичного объекта, если вы пытаетесь отправить новое содержимое с тем же именем большого двоичного объекта.

Если вы не хотите переопределять содержимое, вы можете кое-что сделать, но тогда вам придется написать для этого код.

  1. Перед отправкой проверьте, существует ли большой двоичный объект, и завершите операцию отправки, а затем сообщите пользователю, чтобы он либо выбрал другое имя для большого двоичного объекта, либо назначил новое имя в вашем коде. Вы можете проверить наличие большого двоичного объекта, вызвав blob.ExistsAsync, или выполнить операцию, используя условие доступа, как вы делаете сейчас. В первом случае вы получите обратно истинное / ложное значение, и на основании этого вы решите, что вы хотите сделать. Во втором случае операция загрузки завершится неудачно с PreConditionNotMet (412 Status Code), поэтому вам нужно будет перехватить исключение и решить, что вы хотите сделать.
  2. Если вы намерены вести журнал всех изменений, вам следует обратить внимание на blob snapshot функцию, доступную в хранилище BLOB-объектов Azure. Когда вы делаете снимок большого двоичного объекта, он создает копию большого двоичного объекта, доступную только для чтения. Однако имейте в виду, что в этом случае будет только один большой двоичный объект и много снимков. Каждый снимок уникально идентифицируется датой / временем, когда он был сделан. Вы можете получить большой двоичный объект и его снимки, чтобы просмотреть историю изменений, внесенных в этот большой двоичный объект.
person Gaurav Mantri    schedule 08.12.2017

Теперь существует CloudAppendBlob класс, позволяющий добавлять содержимое в существующий большой двоичный объект:

var account = CloudStorageAccount.Parse("storage account connectionstring");
var client = account.CreateCloudBlobClient();
var container = client.GetContainerReference("container name");
var blob = container.GetAppendBlobReference("blob name");

В вашем случае вы хотите добавить из файла:

await blob.AppendFromFileAsync("file path");

Но вы можете добавить текст, массив байтов, поток. Проверить документацию.

person Thomas    schedule 11.12.2017