Как загрузить файл из формы Flask HTML в корзину S3, используя python? - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть форма HTML (реализована в Flask) для загрузки файлов. И я хочу сохранить загруженные файлы непосредственно на S3.

Соответствующая часть реализации Flask выглядит следующим образом:

@app.route('/',methods=['GET'])
def index():
    return '<form method="post" action="/upload" enctype="multipart/form-data"><input type="file" name="files" /><button>Upload</button></form>'

Затем я использую boto3 для загрузки файла на S3 следующим образом:

file = request.files['files']
s3_resource = boto3.resource(
    's3',
     aws_access_key_id='******',
     aws_secret_access_key='*******')

bucket = s3_resource.Bucket('MY_BUCKET_NAME')

bucket.Object(file.filename).put(Body=file)

file является werkzeug.datastructures.FileStorage объектом.

Но я получаю следующую ошибку при загрузке файла на S3:

botocore.exceptions.ClientError: An error occurred (BadDigest) when calling the PutObject operation (reached max retries: 4): The Content-MD5 you specified did not match what we received.

Как загрузить файл на S3?

1 Ответ

1 голос
/ 15 февраля 2020

Поскольку вы используете Flask веб-фреймворк, переменная file имеет тип werkzeug.datastructures.FileStorage .

Я думаю, что проблема заключается в том, что put() метод ожидает в качестве аргумента Body байтовую последовательность или файлоподобный объект. Таким образом, он не знает, что делать с объектом Flask FileStorage.

Возможным решением может быть использование file.read() для получения последовательности байтов и последующей передачи ее на put():

bucket.Object(file.filename).put(Body=file.read())
...