Вычислить S3 ETag для zip-файла после распаковки. - PullRequest
0 голосов
/ 07 августа 2020

У меня есть файл в S3, который представляет собой файл zip, скажем something.zip, который содержит папку, скажем, something, а внутри папки некоторое содержимое. Я использую boto3 вместо python3.6, загружаю его, затем распаковываю и использую для своих нужд. Позже, когда мне нужно будет использовать файлы в папке something, мне нужно будет убедиться, что она действительно никоим образом не подделана. Я не хочу снова загружать весь файл, а затем разархивировать его. Поэтому я подумал о том, чтобы снова заархивировать папку something в something.zip, а затем вычислить S3 ETag. Я использую эту функцию ниже, чтобы проверить загрузку, вычислив ETag перед загрузкой, а затем сверяясь с ETag, предоставленным функцией list_objects в boto_client, и она работает отлично, и я могу проверить загрузки.

def calculate_s3_etag(folder_path, chunk_size=8 * 1024 * 1024):
    md5s = []
    with open(folder_path, 'rb') as fp:
        while True:
            data = fp.read(chunk_size)
            if not data:
                break
            md5s.append(hashlib.md5(data))

    if len(md5s) == 1:
        return '"{}"'.format(md5s[0].hexdigest())

    digests = b''.join(m.digest() for m in md5s)
    digests_md5 = hashlib.md5(digests)
    return '"{}-{}"'.format(digests_md5.hexdigest(), len(md5s))

Но когда я делаю то же самое для заархивированного файла, который я создал, заархивировав папку something в something.zip, это не работает, и я не могу проверить папку. Я что делаю неправильно? Я обратился к некоторым обсуждениям, чтобы проверить их, но нигде не смог найти этот конкретный вариант использования c. Насколько я понял, если бы я рассчитал ETag для самого исходного загруженного файла, это сработало бы, верно?

Есть ли способ сделать это? Или есть лучший способ достичь моей цели? Мне просто нужно проверить, действительно ли содержимое папки находится в том же состоянии, когда я загружал его из S3.

Примечание: размер моего файла составляет от 10 МБ до 800 МБ, поэтому я не думаю, что проблема с 5 ГБ повлияет на меня, но у меня нет большого опыта работы с S3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...