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 の値になるのが注意です