Flask将图像上载到S3,而不将其保存到本地文件系统
我需要上传一张用户提交的照片到s3存储桶。但是,我不断得到以下错误:Flask将图像上载到S3,而不将其保存到本地文件系统,flask,boto3,Flask,Boto3,我需要上传一张用户提交的照片到s3存储桶。但是,我不断得到以下错误: TypeError: expected str, bytes or os.PathLike object, not FileStorage 如何将文件存储为字符串/字节而不是文件存储?相关代码如下: @user_api.route('upload-profile-photo', methods=['PUT']) @Auth.auth_required def upload_profile_photo(): """ U
TypeError: expected str, bytes or os.PathLike object, not 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)
为了通过
文件存储
实现这一点,我使用方法put\u object()
:
注意对的调用是可选的(您可以简单地传递image\u file.filename
),但是可以非常方便地验证文件名。
否则,添加一些异常处理会很好,但大致思路如下:不需要open()
文件(需要存储在本地)
我鼓励大家看一看,了解一下upload\u fileobj()的区别。我想我误解了put.object和upload\u fileobj的功能。你的建议奏效了。谢谢你的意思是说
secure\u filename(image\u file.filename)
?我看不到在哪里创建了文件
变量。
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)