从上传HTML格式的文件用瓶和Boto3

问题描述 投票:0回答:2

我想直接从上传的HTML格式的文件,以S3没有首先把它保存到服务器。我使用Boto3和瓶。烧瓶和HTML代码贴在下面。我测试S3的连接,这样,必须有我的HTML形式的问题。该错误表示“文件名必须是一个字符串”。谢谢你的帮助。

烧瓶:

.route('/upload', methods=['GET', 'POST'])
@login_required
def upload():
    try:
        latestfile = request.form.get('filetoupload')
        conn = boto3.client('s3', region_name="eu-west-1", endpoint_url="example.com", aws_access_key_id='the access key here', aws_secret_access_key='the secret key here',)
        conn.create_bucket(Bucket="mytestbucket22")
        bucket_name = "mytestbucket22"
        conn.upload_file(latestfile, bucket_name, latestfile)
        return render_template('dashboard.html', name=current_user.username, sumsg="Upload done!")
    except Exception as ermsg:
        print(ermsg)
        return render_template('dashboard.html', name=current_user.username, ermsg=ermsg)

HTML:

<form action="./upload" method="post" enctype="multipart/form-data">
    <input name="filetoupload" type="file">
    <button type="submit" class="buttonformatting" onclick="showImage();">Download</button></a>
</form>
python html amazon-s3 flask boto3
2个回答
0
投票

一旦你从烧瓶中上传的文件要求,你可以使用conn.upload_fileobj()方法上传。您现在正在使用conn.upload_file(),它预计,指向磁盘上的文件的文件名。

这样做

file = request.files['filefield']
conn.upload_fileobj(file, 'mybucket', 'mykey')

更多的文档和信息:

烧瓶请求对象为您提供了一个FileStorage对象的行为就像一个普通的Python文件:http://flask.pocoo.org/docs/0.12/api/#flask.Request.files

读到这里Boto3文档上:https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.upload_fileobj


0
投票

你需要建立一个形式签署的政策如下记载:https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

您可以使用此工具瓶做签名生成为您提供:https://github.com/fastmonkeys/pontus

从他们的网站上的例子的复制粘贴,生成表单字段值(这是由你来把在HTML表单):

import boto3
from flask import current_app
from pontus import AmazonS3SignedRequest

session = boto3.session.Session(
    aws_access_key_id=current_app.config.get('AWS_ACCESS_KEY_ID'),
    aws_secret_access_key=current_app.config.get('AWS_SECRET_ACCESS_KEY')
)
bucket = session.resource('s3').Bucket('testbucket')

signed_request = AmazonS3SignedRequest(
    key_name=u'my/file.jpg',
    mime_type=u'image/jpeg',
    bucket=bucket,
    session=session
)

signed_request.form_fields
© www.soinside.com 2019 - 2024. All rights reserved.