删除 Flask 中 s3 Bucket 中未使用的图像
Deleting an unused image in s3 Bucket in Flask
我的 FLASK api 中有一个路由,它可以将图像上传到我的 s3 存储桶,然后将 url 保存到用户对象的 avatar_url 字段中。
@bp.route('/user/<userid>/files-upload', methods=['POST'])
def upload_file(userid):
user = db_session.query(User).get(userid)
img = request.files['file']
if img:
filename = secure_filename(img.filename)
img.save(filename)
s3.upload_file(
Bucket = bucket,
Filename = filename,
Key = filename,
ExtraArgs={
"ACL": 'public-read',
"ContentType": img.content_type
}
)
msg = "Upload Done ! "
url = f'https://{bucket}.s3.amazonaws.com/{filename}'
user.avatar_url = url
try:
db_session.commit()
return user_schema.dumps(user)
except:
db_session.rollback()
raise
这工作得很好,但后来我意识到,如果用户多次更改他们的图片,这可能会导致一堆未使用的文件闲置并堵塞我的存储桶。我想我需要起草一些删除旧文件的功能(如果有的话)?然后保存新文件?任何建议将不胜感激。
我建议在S3中使用用户ID作为对象键,这样有以下好处:
- 用户以前上传的任何文件都会被新上传的文件覆盖。这会自动消除监视和查找旧文件的需要。
- 如果组织决定开始保留旧版本,启用对象版本控制将很容易,这样你们就可以保留旧版本的个人资料照片。
avatar-s3/user-1.png
avatar-s3/user-2.png
我的 FLASK api 中有一个路由,它可以将图像上传到我的 s3 存储桶,然后将 url 保存到用户对象的 avatar_url 字段中。
@bp.route('/user/<userid>/files-upload', methods=['POST'])
def upload_file(userid):
user = db_session.query(User).get(userid)
img = request.files['file']
if img:
filename = secure_filename(img.filename)
img.save(filename)
s3.upload_file(
Bucket = bucket,
Filename = filename,
Key = filename,
ExtraArgs={
"ACL": 'public-read',
"ContentType": img.content_type
}
)
msg = "Upload Done ! "
url = f'https://{bucket}.s3.amazonaws.com/{filename}'
user.avatar_url = url
try:
db_session.commit()
return user_schema.dumps(user)
except:
db_session.rollback()
raise
这工作得很好,但后来我意识到,如果用户多次更改他们的图片,这可能会导致一堆未使用的文件闲置并堵塞我的存储桶。我想我需要起草一些删除旧文件的功能(如果有的话)?然后保存新文件?任何建议将不胜感激。
我建议在S3中使用用户ID作为对象键,这样有以下好处:
- 用户以前上传的任何文件都会被新上传的文件覆盖。这会自动消除监视和查找旧文件的需要。
- 如果组织决定开始保留旧版本,启用对象版本控制将很容易,这样你们就可以保留旧版本的个人资料照片。
avatar-s3/user-1.png
avatar-s3/user-2.png