Загруженный файл из Html формы на S3 с использованием python, но с получением пустого текстового файла - PullRequest
0 голосов
/ 16 февраля 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="file" /><button>Upload</button></form>'

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

@app.route('/upload',methods = ['GET','POST'])
    def upload_file():
        if request.method =='POST': 
            file = request.files['file']
            if file:
                filename = secure_filename(file.filename)
                #file.save(os.path.join(UPLOAD_FOLDER,filename))
                s3_resource = boto3.resource('s3',aws_access_key_id='****',
                            aws_secret_access_key='*****')
                buck = s3_resource.Bucket('MY_BUCKET_NAME')
                buck.Object(file.filename).put(Body=file.read())

            return 'uploaded'

Файл успешно загружен в S3 Bucket. И при попытке открыть этот файл он открывается как пустой текстовый файл. Даже я пытался установить ContentType в put() метод, но все еще не работает.

Также его размер показывает 0B

enter image description here

Пожалуйста, дайте мне знать, что происходит не так?

Спасибо!

1 Ответ

2 голосов
/ 16 февраля 2020

Вы, конечно, достигли конца потока.

file.read() не имеет байтов для чтения, следовательно, пустой файл на s3.

Либо попробуйте file.seek(0) для сброса потока, либо вы должны убедитесь, что вы читаете файл один раз.

Например:

# You just read the file here.
file.save(os.path.join(UPLOAD_FOLDER, filename))
# file.read() is empty now, you reached to the end of stream

# You are again reading the file here but file.read() is empty, so reset the stream.
file.seek(0)
# file.read() is back to original now
buck.Object(file.filename).put(Body=file.read())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...