FastAPI教程-上传文件高级用法

需要掌握:FastAPI教程-上传文件

多文件上传

用List[UploadFile]接收多个文件。

from typing import List

@app.post("/upload/multi")
async def upload_multi(files: List[UploadFile] = File(...)):
    saved = []
    for file in files:
        path = f"uploads/{file.filename}"
        with open(path, "wb") as f:
            # 每次读1MB,循环写入
            while chunk := await file.read(1024 * 1024):
                f.write(chunk)
        await file.close()
        saved.append({"filename": file.filename, "size": await file.read()})
    return {"saved_files": saved}

文件+表单混合上传

同时接收文件与普通表单字段。

from fastapi import Form

@app.post("/upload/form")
async def upload_form(
    file: UploadFile = File(...),
    username: str = Form(...),
    desc: str = Form(None)
):
    return {
        "username": username,
        "desc": desc,
        "file": file.filename
    }

高级校验

校验文件大小

from typing import Annotated
from fastapi import FastAPI, UploadFile, File

app = FastAPI()

# 企业标准写法:接口层精准限制 5MB
@app.post("/upload")
async def upload(
    file: Annotated[UploadFile, File(max_size=5 * 1024 * 1024)]
):
    # 保存文件(流式,不占内存)
    with open(file.filename, "wb") as f:
        f.write(await file.read())

    return {"msg": "上传成功"}

类型/后缀校验

ALLOWED_EXT = {"jpg", "jpeg", "png"}
ALLOWED_MIME = {"image/jpeg", "image/png"}

@app.post("/upload/type")
async def upload_type(file: UploadFile = File(...)):
    # 校验后缀
    ext = file.filename.split(".")[-1].lower()
    if ext not in ALLOWED_EXT:
        raise HTTPException(status_code=400, detail="仅支持jpg/png")
    # 校验MIME
    if file.content_type not in ALLOWED_MIME:
        raise HTTPException(status_code=400, detail="文件类型错误")
    return {"msg": "类型合法"}

原文出处:/show_1GW3HRKjwGmB.html