You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:35:19