У меня проблема с загрузкой больших файлов, и я нахожу подходящий метод ContentMD5 для проверки передачи
Я начал с client.upload_file. Этот метод не имеет параметра ContentMD5. Поэтому я попытался использовать функцию для создания локального ETag для файла и сверить его с переданным файлом.
Я обнаружил, что если вы используете шифрование KMS в своей корзине S3, ваш etag каким-то образом зависит от KMS, а локальный сгенерированный ETag не равен ETag в S3.
Вторая попытка заключалась в использовании Object.put. Здесь вы можете использовать ContentMD5, и KMS также работает, но функция использует один поток для загрузки, а не несколько частей. отдельные потоки не могут загружать большие файлы.
Так что теперь я как бы застрял. Есть функция создания 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)