FastAPI ファイルアップロード

python-multipart がインストール済であることが前提です。

チュートリアルを見て作ったサンプルです。2通りです

import uvicorn
from fastapi import FastAPI, File, UploadFile
import csv
from io import StringIO

app = FastAPI()
@app.post("/upload1")
async def upload1(file: UploadFile=File() ):
    print(f"file name = {file.filename}")
    print(f"file size = {file.size}")
    contents = await file.read()
    print(contents)
    # TODO
    return {"file_name":file.filename, "file_size":file.size}

@app.post("/upload2")
async def upload2(file: UploadFile=File()):
    print(f"file name = {file.filename}")
    print(f"file size = {file.size}")
    # byte に、読込み
    file_bytes = file.file.read()
    buffer = StringIO(file_bytes.decode('utf-8'))
    # CSV として読込み
    csvReader = csv.DictReader(buffer)
    for row in csvReader:
        print(row)
    # TODO
    return {"file_name":file.filename, "file_size":file.size}

UploadFile でアップロードするファイルを受信します。
基本、await で read() を実行しますが、/upload2 のように、
読むこともできます。
/upload2 は、受け取ったファイルをCSVとして読み込む例です。

multipart/form-data ですから、ファイルの他に他のパラメータを与えることもできます。
他のパラメータも指定する方法は、単純で以下のようにします。

from fastapi import Form

Form をインポートして

@app.post("/upload3")
async def upload3(file: UploadFile=File(), group :int=Form(ge=1, le=10, default=1)):
    print(f"filename = {file.filename}")
    print(f"file size = {file.size}")
    print(f"group={group}")

default を指定しているので1≦group≦10 以外の数値はエラーでなく、default の値になるのが注意です