使用Flask结合boto3直接上传文件至S3失败,求问题排查
使用boto3上传文件到S3存储桶失败,求排查错误
我尝试使用boto3将文件上传至我的S3存储桶,以下是我编写的代码:
AWS_ACCESS_KEY_ID = "**" AWS_SECRET_ACCESS_KEY = "**" BUCKET_NAME = 'dmfiles' AWS_REGION = 'us-east-1' s3_client = boto3.client( service_name = 's3', region_name = AWS_REGION, aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY) #UPLOAD FILES TO AWS S3 if 'file' not in request.files: return "No file part", 400 file = request.files['file'] if file.filename == '': return "No selected file", 400 if file: filename = secure_filename(file.filename) # Upload file to S3 filename = secure_filename(file.filename) response = s3_client.upload_file(file,BUCKET_NAME,filename) print(f'upload_log_to_aws response: {response}')
我已查阅过类似问题但均未解决我的问题,目前这段代码无法完成文件上传,请问我哪里出错了?
排查出的关键问题及解决办法
缩进语法错误:文件上传的判断逻辑块(
if 'file' not in request.files:开始的代码)存在多余缩进,Python对缩进层级要求严格,需将这部分代码的缩进调整到与s3_client定义同级的位置,否则会触发语法报错。upload_file参数不匹配:s3_client.upload_file()的第一个参数要求是本地文件路径字符串或文件描述符,而你直接传入了Flask的FileStorage对象(request.files['file']返回的实例),方法无法正确读取文件内容。解决方式二选一:- 改用支持类文件对象的
upload_fileobj方法:response = s3_client.upload_fileobj(file, BUCKET_NAME, filename) - 先将文件保存到本地临时路径,再用
upload_file上传(上传后可删除临时文件):import os temp_path = f'/tmp/{filename}' file.save(temp_path) response = s3_client.upload_file(temp_path, BUCKET_NAME, filename) os.remove(temp_path)
- 改用支持类文件对象的
缺失必要导入:代码中使用了
request、secure_filename但未显示导入,需在代码顶部添加:import boto3 from flask import request from werkzeug.utils import secure_filename权限验证:检查你的AWS密钥是否拥有
s3:PutObject权限,同时确认目标存储桶的访问策略允许该密钥执行上传操作。可以先测试用该密钥调用s3_client.list_buckets()验证密钥有效性。冗余代码:两次调用
filename = secure_filename(file.filename)属于重复操作,保留一次即可。
内容的提问来源于stack exchange,提问作者chad
相关产品推荐
相关产品推荐

