Python如何使用FastAPI玩轉(zhuǎn)文件上傳功能
一核心武器:UploadFile和File()
FastAPI處理文件上傳只需兩個關(guān)鍵組件:
from fastapi import FastAPI, UploadFile, File
app = FastAPI()
???????@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)): #
return {"filename": file.filename}
關(guān)鍵解析:
- UploadFile:智能文件對象,自動處理內(nèi)存/磁盤存儲切換,適合大文件
- File(...):聲明表單文件字段,...表示參數(shù)必填
優(yōu)勢對比:
- bytes = File():適合小文件(默認上限1MB),直接讀入內(nèi)存
- UploadFile:支持大文件流式處理,自帶異步接口
二上傳實戰(zhàn)四步曲
1. 基礎(chǔ)保存:直接寫入磁盤
import shutil
???????@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
with open(file.filename, "wb") as buffer:
shutil.copyfileobj(file.file, buffer) #
return {"status": "success"}
2. 流式處理:應(yīng)對大文件
@app.post("/large-upload/")
async def large_upload(file: UploadFile):
with open(file.filename, "wb") as f:
while chunk := await file.read(1024 * 1024): # 每次讀取1MB
f.write(chunk) #
為何更優(yōu):避免單次讀取導(dǎo)致內(nèi)存溢出
3. 文件元信息:一鍵獲取關(guān)鍵數(shù)據(jù)
@app.post("/meta-upload/")
async def meta_upload(file: UploadFile):
return {
"文件名": file.filename,
"類型": file.content_type, # 如image/png
"大小": f"{file.size / 1024:.2f} KB" #
}
4. 多文件上傳:一次接收多個
@app.post("/multi-upload/")
async def multi_upload(files: list[UploadFile] = File(...)): # ?? 注意list
return {"count": len(files), "names": [f.filename for f in files]}
三安全加固:限制與校驗
1. 文件類型過濾
ALLOWED_TYPES = ["image/jpeg", "image/png"]
@app.post("/safe-upload/")
async def safe_upload(file: UploadFile):
if file.content_type not in ALLOWED_TYPES:
raise HTTPException(400, "僅支持JPG/PNG格式") #
2. 文件大小控制
@app.post("/size-limit/")
async def size_limit(
file: UploadFile = File(..., max_size=100_000_000) # 限制100MB
):
... #
3. 文件名消毒
import re
def sanitize_filename(filename: str) -> str:
return re.sub(r"[^\w\.]", "", filename) # 移除非法字符
# 使用:sanitized_name = sanitize_filename(file.filename)
四高階技巧:性能與體驗優(yōu)化
1. 臨時文件處理
import tempfile
@app.post("/temp-upload/")
async def temp_upload(file: UploadFile):
with tempfile.NamedTemporaryFile(delete=False, suffix=".tmp") as tmp:
shutil.copyfileobj(file.file, tmp)
tmp_path = tmp.name # 獲取臨時文件路徑
# ...后續(xù)處理
2. 客戶端調(diào)用示例
CURL命令:
curl -X POST "http://localhost:8000/upload/" \ -H "Content-Type: multipart/form-data" \ -F "file=@cat.jpg" #
Python Requests調(diào)用:
import requests
url = "http://localhost:8000/upload/"
files = {"file": open("cat.jpg", "rb")}
response = requests.post(url, files=files) #
3. 文檔增強技巧
給Swagger文檔添加文件說明:
@app.post("/upload/",
summary="上傳文件",
description="支持圖片/文檔,最大100MB",
response_description="返回文件名和大小"
)
async def upload_file(...): ...
五避坑指南(血淚總結(jié)!)
1.遺忘python-multipart
必須安裝:pip install python-multipart,否則報錯Form data parsing error
2.同步阻塞寫入
- 避免:content = file.file.read()(大文件卡死進程)
- 正確:await file.read() 異步讀取
3.文件覆蓋風險
多人上傳同名文件時,采用唯一命名:
import uuid
filename = f"{uuid.uuid4()}_{file.filename}"
4.跨平臺路徑陷阱
使用pathlib處理路徑:
from pathlib import Path
save_path = Path("uploads") / sanitize_filename(file.filename)
到此這篇關(guān)于Python如何使用FastAPI玩轉(zhuǎn)文件上傳功能的文章就介紹到這了,更多相關(guān)Python FastAPI文件上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch 圖像中的數(shù)據(jù)預(yù)處理和批標準化實例
今天小編就為大家分享一篇pytorch 圖像中的數(shù)據(jù)預(yù)處理和批標準化實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python 內(nèi)置函數(shù)memoryview(obj)的具體用法
本篇文章主要介紹了Python 內(nèi)置函數(shù)memoryview(obj)的具體用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
python利用pd.cut()和pd.qcut()對數(shù)據(jù)進行分箱操作
本文主要介紹了python利用pd.cut()和pd.qcut()對數(shù)據(jù)進行分箱操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

