(1)動的にダウンロードするコンテンツを作成してダウンロードさせる場合
例)CSVを生成→ダウンロード
from fastapi import FastAPI, Response app = FastAPI() @app.get("/download") def csvget(): content = '"あ","い","う"\n"1","2","3"' filename = "data.csv" return Response(content=content.encode("utf-8-sig"), headers={"Content-Disposition": f'attachement; filename={filename}'}, media_type="text/csv")
content.encode("utf-8-sig") とすることで、BOM付きのUTF-8 にしている。
SJIS エンコードにしたければ、content.encode("MS932") とする。
ダウンロードファイル名に2バイト文字を含む場合は、
urllib.parse の quoteでURLエンコードが必要になる。
from urllib.parse import quote
return Response(content=content.encode("utf-8-sig"), headers={"Content-Disposition": f"attachement; filename*=UTF-8''{quote(filename)}"}, media_type="text/csv")
(2)既に存在するファイルをダウンロードさせる場合
FileResponse を使用し、path とダウンロードファイル名を指定する。
from fastapi.responses import FileResponse
return FileResponse(path=file_path, filename=f'{filename}' )