FastAPI 表单参数与文件上传完全指南:从基础到高级实战 🚀
title: FastAPI 表单参数与文件上传完全指南:从基础到高级实战 🚀
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login/")
async def login(username: str = Form(...), password: str = Form(...)):
return {"username": username}
@app.post("/register/")
async def register(name: str = Form(...), email: str = Form(...)):
return {"name": name, "email": email}
{
"name": "John Doe",
"email": "john.doe@example.com"
}
from pydantic import Field
@app.post("/contact/")
async def contact(name: str = Form(..., min_length=3), message: str = Form(..., max_length=1000)):
return {"name": name, "message": message}
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
return {"filename": file.filename}
@app.post("/upload-multiple/")
async def upload_multiple_files(files: List[UploadFile] = File(...)):
return {"filenames": [file.filename for file in files]}
from fastapi import File, UploadFile
from pydantic import Field
@app.post("/upload-validated/")
async def upload_validated_file(file: UploadFile = File(..., max_size=1024 * 1024, regex=r"\.(jpg|png)$")):
return {"filename": file.filename}
import aiofiles
import os
@app.post("/upload-store/")
async def upload_store_file(file: UploadFile = File(...)):
async with aiofiles.open(f"uploads/{file.filename}", "wb") as out_file:
content = await file.read()
await out_file.write(content)
return {"filename": file.filename}
from fastapi.responses import FileResponse
@app.get("/download/{filename}")
async def download_file(filename: str):
return FileResponse(f"uploads/{filename}")
from fastapi.responses import StreamingResponse
@app.post("/upload-stream/")
async def upload_stream_file(file: UploadFile = File(...)):
return StreamingResponse(file.file, media_type=file.content_type)
from fastapi import Form
from pydantic import Field
@app.post("/contact/")
async def contact(name: str = Form(..., min_length=3), message: str = Form(..., max_length=1000)):
return {"name": name, "message": message}
from fastapi import File, UploadFile
from typing import List
@app.post("/upload-multiple/")
async def upload_multiple_files(files: List[UploadFile] = File(...)):
return {"filenames": [file.filename for file in files]}
| 错误代码 | 典型触发场景 | 解决方案 |
|---|---|---|
| 422 | 类型转换失败/校验不通过 | 检查参数定义的校验规则 |
| 413 | 上传文件超过服务器限制 | 调整服务器配置或限制上传文件大小 |
| 500 | 未捕获的文件处理异常 | 添加 try/except 包裹敏感操作 |
| 400 | 自定义校验规则触发拒绝 | 检查验证器的逻辑条件 |
from fastapi.responses import StreamingResponse
@app.post("/upload-stream/")
async def upload_stream_file(file: UploadFile = File(...)):
return StreamingResponse(file.file, media_type=file.content_type)
from fastapi import File, UploadFile
@app.post("/upload-validated/")
async def upload_validated_file(file: UploadFile = File(..., max_size=1024 * 1024)):
return {"filename": file.filename}
curl -F "file=@test.txt" http://localhost:8000/upload/


评论
发表评论