boto3 s3 загрузить большой файл с проверкой содержимого MD5 - PullRequest
0 голосов
/ 19 сентября 2019

У меня проблема с загрузкой больших файлов и я нашел пригодный для использования метод ContentMD5, чтобы предоставить подтверждение переноса

Я начал с файла client.upload_file.Этот метод не имеет параметра ContentMD5.Поэтому я попытался использовать функцию для генерации локального ETag для файла и проверки его с помощью переданного файла.

Я обнаружил, что если вы используете шифрование KMS в вашей корзине S3, ваш etag как-то зависит от KMSи локальный сгенерированный ETag не равен тому в S3.

Вторая попытка использовала Object.put.Здесь вы можете использовать ContentMD5, и KMS также работает, но функция использует один поток для загрузки, а не mutltipart.отдельные потоки не могут загружать большие файлы.

Так что теперь я застрял.Существует функция создания MultiPart и upload_part, но я не могу найти никаких примеров с ContentMD5 в целом.

, который был попыткой Object.put

binary_hash = hashlib.md5(open(file_name,'rb').read()).digest()
file_md5 = base64.b64encode(binary_hash)

metadata = {
    "md5sum": file_md5
}

try:
    obj = s3_resource.Object(bucket, fileobj)
    obj.put(
        Body=open(file_name, 'rb'),
        ContentMD5=file_md5,
        Metadata=metadata,
        ServerSideEncryption='aws:kms',
        SSEKMSKeyId=s3kmskey)

1 Ответ

0 голосов
/ 19 сентября 2019

Загрузка нескольких частей разбивает файл на куски.Итак, вам нужно будет вычислить контрольную сумму MD5 для каждого чанка, а затем объединить контрольную сумму всей контрольной суммы.ETag будет контрольной суммой вышеупомянутого сцепления, сопровождаемого -n, где n - число частей.Это не доступно в официальной документации.

Этот скрипт Python может сделать всю работу за вас.

Примечание. Это не работает для шифрования KMS как документация предполагает .

Вы также можете вычислить хеш MD5 и передать его вместе с заголовком Content-MD5.

...