FastAPI 學習之路(十七)上傳檔案
系列文章:
FastAPI 學習之路(一)fastapi--高效能web開發框架
FastAPI 學習之路(十二)介面幾個額外資訊和額外資料型別
FastAPI 學習之路(十三)Cookie 引數,Header引數
我們去實現下上傳,看一下檔案如何上傳
from fastapi import FastAPI, File, UploadFile app = FastAPI() @app.post("/files/") def create(file: bytes = File(...)): return {"file_size": len(file)} @app.post("/uploadfile/") def upload_file(file: UploadFile = File(...)): return {"filename": file.filename}
我們去測試下
試下另外一個介面
兩個介面都是可以上傳檔案的。
File是直接繼承自Form的類。
注意,從fastapi匯入的Query、Path、File等項,實際上是返回特定類的函式。
UploadFile的屬性如下:
-
filename:上傳檔名字串(str),例如,myimage.jpg;
-
content_type:內容型別(MIME 型別 / 媒體型別)字串(str),例如,image/jpeg;
-
file:SpooledTemporaryFile(file-like物件)。其實就是 Python檔案,可直接傳遞給其他預期 file-like 物件的函式或支援庫。
UploadFile支援以下async方法,(使用內部SpooledTemporaryFile)可呼叫相應的檔案方法。
-
write(data):把data(str或bytes)寫入檔案;
-
read(size):按指定數量的位元組或字元(size(int))讀取檔案內容;
-
seek(offset):移動至檔案offset(int)位元組處的位置;
-
例如,await myfile.seek(0)移動到檔案開頭;
-
執行await myfile.read()後,需再次讀取已讀取內容時,這種方法特別好用;
-
close():關閉檔案。
因為上述方法都是async方法,要搭配「await」使用。
例如,在async路徑操作函式內,要用以下方式讀取檔案內容
contents = await myfile.read()
使用async方法時,FastAPI線上程池中執行檔案方法,並awiat操作完成。
FastAPI的UploadFile直接繼承自Starlette的UploadFile,但添加了一些必要功能,使之與Pydantic及 FastAPI 的其它部件相容。
我們實現下多個檔案的上傳
from fastapi import FastAPI, File, UploadFile from typing import List app = FastAPI() @app.post("/files/") async def create(fileS: List[bytes] = File(...)): return {"file_sizes": [len(file) for file in fileS]} @app.post("/uploadfile/") async def upload_file(fileS: List[UploadFile] = File(...)): return {"filenames": [file.filename for file in fileS]}
我們看下上傳結果
我們可以針對這些檔案進行處理。
文章首發在公眾號,歡迎關注。