fastapi: 实现单文件上传和多文件上传

一,安装所需的库

$ pip install python-multipart

二,代码:

# app/api/v1/asset.py
from fastapi import APIRouter, Depends, UploadFile, File
from starlette.requests import Request
from starlette.templating import Jinja2Templates

from app.core.Settings import get_settings, settings
from app.core.templates import templates
from app.middleware.log_single_route import log_this_route
import os
import shutil
from typing import List

# 创建路由器实例
# prefix:所有路由的统一前缀,避免重复写"/asset"
# tags:在Swagger文档中分组显示
router = APIRouter(prefix="/asset", tags=["文件管理"])


@router.post("/upload/single")
async def upload_single_file(file: UploadFile = File(...)):
    # 拼接本地保存路径
    upload_dir = settings.UPLOAD_DIR
    file_path = os.path.join(upload_dir, file.filename)

    # 打开本地文件并将上传的文件内容复制进去
    with open(file_path, "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)

    return {
        "message": "文件上传成功",
        "filename": file.filename,
        "saved_path": file_path
    }


@router.post("/upload/multiple")
async def upload_multiple_files(files: List[UploadFile] = File(...)):
    saved_files = []
    upload_dir = settings.UPLOAD_DIR
    for file in files:
        file_path = os.path.join(upload_dir, file.filename)

        # 保存单个文件
        with open(file_path, "wb") as buffer:
            shutil.copyfileobj(file.file, buffer)

        saved_files.append({
            "filename": file.filename,
            "saved_path": file_path
        })

    return {
        "message": f"成功上传 {len(files)} 个文件",
        "files": saved_files
    }

三,测试效果:

image

posted @ 2026-06-24 16:22  刘宏缔的架构森林  阅读(7)  评论(0)    收藏  举报