Я хочу загрузить файл в хранилище BLOB-объектов Azure только в том случае, если большой двоичный объект, который он будет перезаписывать (файл большого двоичного объекта), отличается от текущего файла (тот, который загружается).
Есть ли у кого-нибудь предложения по этой функциональности с использованием С#/.Net Core?
Есть несколько способов сделать это в зависимости от того, что вы можете сделать с текущим файлом.
Исходя из вашего вопроса, это, вероятно, не вариант для вас. Следующее, что нужно проверить, это свойства большого двоичного объекта. Вы можете разрешить хранилищу BLOB-объектов использовать значения по умолчанию или переопределить их при отправке BLOB-объекта.
Вы можете взглянуть на них на портале, и они будут выглядеть примерно так:
LAST MODIFIED 11/20/2020, 1:28:22 PM
CREATION TIME 7/31/2019, 11:44:55 AM
VERSION ID -
TYPE Block blob
SIZE 64 B
ACCESS TIER N/A
ACCESS TIER LAST MODIFIED N/A
SERVER ENCRYPTED true
ETAG 0x8D88D820FE0B5E4
CONTENT-TYPE application/octet-stream
CONTENT-MD5 vfS7mlI8PCeeG2yXyUQ25A==
LEASE STATUS Unlocked
LEASE STATE Available
Чтобы получить их на C#, запустите BlobProperties properties = await blob.GetPropertiesAsync();
Если ваш новый файл представляет собой существующий файл + изменения, свойства LastModified может быть достаточно, чтобы определить, отличаются ли они.
Хэш MD5 существующего и нового файла также является хорошим выбором для сравнения. Хэши не являются строго уникальными, но обычно они достаточно уникальны, чтобы определить, был ли файл изменен.
Если вы управляете созданием большого двоичного объекта, а также его обновлением, у вас также есть возможность задать пользовательские свойства для большого двоичного объекта. Это позволит вам установить что-то в большом двоичном объекте, что вы сможете отслеживать, чтобы увидеть, изменилось ли содержимое. Тот же метод GetPropertiesAsync()
извлекает словарь метаданных, и его настройка выполняется путем создания Dictionary<string, string>
и передачи его в blob.SetMetadataAsync(metadata);
Абсолютно худшим случаем будет загрузка существующего большого двоичного объекта и сравнение двух документов. Если нет какой-либо причины, по которой мне абсолютно необходимо это сделать, если бы 2-4 не сработали для меня, я бы выбрал первый вариант и использовал его только в крайнем случае.