Как проверить, что аудиофайл правильно загружен на s3 с контрольной суммой sha 256 с использованием предварительно подписанного URL-адреса? - PullRequest
0 голосов
/ 01 октября 2019

Вот код для проверки загрузки 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)
...