FastAPI 學習之路(十七)上傳文件


系列文章:

  FastAPI 學習之路(一)fastapi--高性能web開發框架

  FastAPI 學習之路(二)

  FastAPI 學習之路(三)

  FastAPI 學習之路(四)

  FastAPI 學習之路(五)

      FastAPI 學習之路(六)查詢參數,字符串的校驗

  FastAPI 學習之路(七)字符串的校驗

    FastAPI 學習之路(八)路徑參數和數值的校驗

  FastAPI 學習之路(九)請求體有多個參數如何處理?

  FastAPI 學習之路(十)請求體的字段

      FastAPI 學習之路(十一)請求體 - 嵌套模型 

    FastAPI 學習之路(十二)接口幾個額外信息和額外數據類型

      FastAPI 學習之路(十三)Cookie 參數,Header參數

    FastAPI 學習之路(十四)響應模型

  FastAPI 學習之路(十五)響應狀態碼

    FastAPI 學習之路(十六)Form表單

我們去實現下上傳,看一下文件如何上傳

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]}

 我們看下上傳結果

 

 

 

 我們可以針對這些文件進行處理。

文章首發在公眾號,歡迎關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM