使用boto3上传图片到S3时如何修改文件名并保存,如datetime.jpg格式
问题解决方法
你的自定义时间戳命名代码无法生效的核心原因是没有把文件后缀拼到最终生成的文件名里,仅生成了文件名前缀,直接替换原接口中S3上传的Key参数即可。
完整修改后的后端代码
# 首先要在文件顶部导入datetime模块 from datetime import datetime import boto3 from flask import request, jsonify @app.route('/fileupload', methods=['POST']) def file_upload(): file = request.files['file'] # 生成带时间戳的文件名 # 兜底处理无后缀的文件 if '.' in file.filename: # 用rsplit从右往左只切割一次,避免文件名本身包含多个点的场景 extension = file.filename.rsplit('.', 1)[-1].lower() else: extension = 'jpg' # 可根据实际需求调整默认后缀 today = datetime.now() mytime = today.strftime('%Y-%m-%d-%H-%M-%S') # 拼接后缀得到完整文件名,示例:file-2024-05-20-14-30-22.jpg filename = f'file-{mytime}.{extension}' s3 = boto3.client('s3', aws_access_key_id="mykey", aws_secret_access_key="myaccesskey" ) s3.put_object( ACL="public-read", Bucket="burket", # 注意替换为你真实的S3存储桶名称,此处拼写大概率是笔误 Body=file, Key=filename, # 替换为生成的带时间戳的文件名 ContentType=file.content_type) # 生成公开访问URL,<你的S3区域>替换为实际区域代码,比如cn-north-1 url = f"https://burket.s3.<你的S3区域>.amazonaws.com/{filename}" print(url) return jsonify({'result': 'success', 'url': url})
注意事项
- 如果需要统一用UTC时间避免时区偏差,可以把
datetime.now()替换为datetime.utcnow() - 生产环境不要把AK/SK硬编码在代码中,建议通过环境变量、IAM角色等方式加载凭据,避免密钥泄露
- 前端代码无需修改,可直接正常使用
内容的提问来源于stack exchange,提问作者min j
相关产品推荐
相关产品推荐

