flask - Flask 将图像上传到 S3 而不将其保存到本地文件系统
问题描述
我需要将用户提交的照片上传到 s3 存储桶。但是我不断收到以下错误:
TypeError: expected str, bytes or os.PathLike object, not FileStorage
我如何能够将文件存储为字符串/字节而不是 FileStorage?相关代码如下:
@user_api.route('upload-profile-photo', methods=['PUT'])
@Auth.auth_required
def upload_profile_photo():
"""
Upload User Profile Photo
"""
key = Auth.auth_user()
bucket = 'profile-photos'
content_type = request.mimetype
image_file = request.files['file']
client = boto3.client('s3',
region_name='sfo2',
endpoint_url='https://example.xxx.amazonaws.com',
aws_access_key_id=os.environ['ACCESS_KEY'],
aws_secret_access_key=os.environ['SECRET_KEY'])
with open(image_file, "rb") as f:
client.upload_fileobj(
bucket,
f,
key,
ExtraArgs={'ACL': 'public-read', 'ContentType': content_type}
)
return custom_response({'message': 'image uploaded'}, 200)
解决方案
iTo 实现这一点FileStorage
,我使用方法put_object()
:
from werkzeug import secure_filename
@user_api.route('upload-profile-photo', methods=['PUT'])
@Auth.auth_required
def upload_profile_photo():
"""
Upload User Profile Photo
"""
key = Auth.auth_user()
bucket = 'profile-photos'
content_type = request.mimetype
image_file = request.files['file']
client = boto3.client('s3',
region_name='sfo2',
endpoint_url='https://example.xxx.amazonaws.com',
aws_access_key_id=os.environ['ACCESS_KEY'],
aws_secret_access_key=os.environ['SECRET_KEY'])
filename = secure_filename(image_file.filename) # This is convenient to validate your filename, otherwise just use file.filename
client.put_object(Body=image_file,
Bucket=bucket,
Key=filename,
ContentType=content_type)
return custom_response({'message': 'image uploaded'}, 200)
请注意,调用 tosecure_filename()
是可选的(您可以简单地 pass image_file.filename
),但可以非常方便地验证文件名。否则添加一些异常处理会很好,但粗略的想法在这里:不需要open()
文件(需要在本地存储)。
我鼓励在这里查看文档,以了解与upload_fileobj()
推荐阅读
- apache-spark - Spark 事件日志目录
- angular - 当输入为 Number 类型时,在模糊时触发 ValueChanges
- python - Plotly Express:您可以在 px.choropleth 中手动定义图例吗?
- powerbi - 如何使用 DAX 在同一个表中按选定值进行过滤?
- php - 函数的参数太少,通过了 1 个,预期正好有 2 个 - Laravel
- javascript - 当我使用 ajax 请求时,为什么我的快速服务器中的 JSON 文件没有下载?
- pdf - 如何从命令行将 PDF 文档的页面合并为单个页面?
- ruby-on-rails - Rolify 与具有特定角色的用户建立关联
- postgresql - 如果两个具有不同隔离级别的事务访问同一个表会发生什么
- typescript - 如何在打字稿中具有多种值类型的类上设置索引签名?