如何通过FASTAPI将上传的Excel文件上传至S3存储桶?上传失败求助
问题分析与修复方案
你的代码存在几个关键问题,导致无法正确将上传文件存入S3:
- 上传内容错误:
object.put(Body=file.filename)传入的是文件名字符串,而非上传文件的实际二进制内容,最终S3只会存储文件名文本,不是你要的Excel文件。 - 多余的文件解析:如果只是要存储原始上传文件,无需将Excel转成DataFrame再转字典,这一步完全没必要,还会消耗内存。
- 文件流处理不当:读取文件后未重置指针,且提前关闭文件,即使后续想重新读取内容也无法实现。
修复后的代码
from fastapi import FastAPI, File, UploadFile import boto3 from botocore.config import Config app = FastAPI() AWS_ACCESS_KEY_ID = "你的密钥ID" AWS_SECRET_ACCESS_KEY = "你的密钥" @app.post('/uploadedfile/') def upload_file(file: UploadFile = File(...)): # 初始化S3资源 s3 = boto3.resource( 's3', aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, config=Config(signature_version='s3v4') ) try: # 读取上传文件的二进制内容 file_content = file.file.read() # 获取S3对象并上传文件内容 s3_object = s3.Object('bucket_name', file.filename) s3_object.put(Body=file_content) finally: # 确保文件流关闭 file.file.close() return {"filename": file.filename, "status": "上传成功"}
额外优化建议
- 添加异常捕获:可以针对S3上传错误、文件读取错误添加具体的异常处理,返回更友好的错误信息:
except Exception as e: return {"filename": file.filename, "status": "上传失败", "error": str(e)} - 验证文件类型:如果只允许上传Excel文件,可以在代码里添加文件后缀校验,比如检查
file.filename.endswith(('.xlsx', '.xls'))。 - 使用上下文管理器:可以用
with语句自动管理文件流,避免手动关闭的遗漏:with file.file as f: file_content = f.read() s3_object.put(Body=file_content)
内容的提问来源于stack exchange,提问作者priya
相关产品推荐
相关产品推荐

