需要掌握: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": "类型合法"}