一,安装所需的库
$ 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]()