首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >flask wtf上传镜像文件到aws s3

flask wtf上传镜像文件到aws s3
EN

Stack Overflow用户
提问于 2019-09-12 13:41:12
回答 1查看 489关注 0票数 0

我想上传图像到亚马逊s3使用预先签署的网址和图像是由用户选择的。所以我使用flask-wtf文件字段来创建文件输入字段。在用户提交表单(PostForm)后,我希望获得图像数据并将其发送到presigned-url。但是我不知道如何从表单中获取图像文件的信息。

请帮帮我!

我使用了下面教程中的示例代码。但不同的是我使用的是flask-wtf,而不是本地镜像文件。

https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html

在下面的代码中,问题行在这里。

代码语言:javascript
运行
AI代码解释
复制
files = {'file': (save_objectname, image.read())}
        http_response = requests.post(response['url'], data=response['fields'], files=files)

当我使用print(image.read())时,它显示b'‘<-什么也没有...

我该如何修复它?

代码语言:javascript
运行
AI代码解释
复制
def create_post():
    form = PostForm()
    save_post_foldername = 'post_images'
    if form.validate_on_submit():
        if form.post_image.data:
            image_file = form.post_image.data
            save_post_objectname = generate_filename(image_file)

            # Generate a presigned S3 POST URL
            post_to_aws_s3(image_file, save_post_foldername, save_post_objectname)
代码语言:javascript
运行
AI代码解释
复制
def post_to_aws_s3(image, save_foldername, save_objectname):
    fields = {
        "acl": "public-read",
        "Content-Type": image.content_type
    }
    conditions = [
        {"acl": "public-read"},
        {"Content-Type": image.content_type}
    ]
    try:
        response = s3_client.generate_presigned_post(
            Bucket=S3_BUCKET,
            Key=save_foldername+'/'+save_objectname,
            Fields=fields,
            Conditions=conditions,
            ExpiresIn=600
        )
        print(response)  
        print(response['url'])  
        print(image.content_type)
        #with open(image, 'rb') as f:
            #files = {'file': ('abc.png', f)}
            #files = {'file': (image, f)}
        files = {'file': (save_objectname, image.read())}
        http_response = requests.post(response['url'], data=response['fields'], files=files)
        print(image.read())
    except ClientError as e:
        print("error")
EN

回答 1

Stack Overflow用户

发布于 2020-01-17 15:18:27

Access_ID和secret ID指的是您的亚马逊网络服务用户访问id和密钥,因为boto3将使用您分配给它的用户来访问您的亚马逊网络服务s3。

代码语言:javascript
运行
AI代码解释
复制
s3 = boto3.resource("s3", aws_access_key_id=os.getenv("ACCESS_ID"), aws_secret_access_key=os.getenv("ACCESS_SECRET_ID"))

s3.Bucket("[NAME OF BUCKET]").put_object(Key="images/"+request.files["image"].filename, Body=request.files["image"] )

确保在表单下的jinja下包含"enctype“,例如

代码语言:javascript
运行
AI代码解释
复制
<form method="POST" action="" enctype="multipart/form-data">
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57908060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档