Вот код для проверки загрузки s3 с использованием md5. Как этот код может быть изменен для поддержки проверки с использованием Sha 256? Я использую Boto 3, чтобы получить предварительно подписанный URL-адрес поста. Я отправляю предварительно подписанную функцию post сумму md5, рассчитанную для файла в локальной системе. После выполнения успешного пост-запроса S3 проверяет, что контрольная сумма md5 такая же, как и вычисленная amazon. Я также использую подпись версии 4 для подписи подписей.
import requests
import logging
import boto3
from botocore.exceptions import ClientError
from botocore.client import Config
def create_presigned_post(bucket_name, object_name,
fields=None, conditions=None, expiration=3600):
s3_client = boto3.client('s3', config=Config(signature_version='s3v4'))
try:
response = s3_client.generate_presigned_post(bucket_name,
object_name,
Fields=fields,
Conditions=conditions,
ExpiresIn=expiration)
except ClientError as e:
logging.error(e)
return None
return response
object_name = '/home/karthik/Desktop/SPOKE/check_sum_s3/SampleAudio_0.7mb.mp3'
import hashlib
import base64
def md5sum(filename):
md5 = hashlib.md5()
with open(filename, 'rb') as f:
for chunk in iter(lambda: f.read(128 * md5.block_size), b''):
md5.update(chunk)
return base64.b64encode(md5.digest())
object_key = 'audio/{}.mp3'.format("12345678")
md5 = md5sum(object_name).decode("utf-8")
response = create_presigned_post('bucket', object_key, fields={
'Content-MD5': str(md5)
},
conditions=[
["starts-with", "$Content-MD5", ""]
])
if response is None:
exit(1)
with open(object_name, 'rb') as f:
files = {'file': (object_name, f)}
http_response = requests.post(response['url'], data=response['fields'], files=files)
print(http_response.text)