【Python3】FastAPIでファイルのダウンロードを行う方法

2022年4月14日

おはこんばんにちは、せなです。
今回はFastAPIでファイルのダウンロードを行う方法を解説したいと思います。

フォルダ構成

今回の説明で使うフォルダ構成を簡単に載せておきますね。

  • main.py
  • files
    • hoge.txt

ソースコードについて

まず、忙しい人のためにソースコードを載せておきます。
説明については、後述していきますので、より理解したい方は下までお読みください。

import uvicorn
from fastapi import FastAPI
from fastapi.responses import FileResponse
from pathlib import Path
from datetime import datetime

app = FastAPI()

@app.get("/files/{filename:path}")
async def download_file(filename: str):
    current = Path()
    file_path = current / "files" / filename
    response = FileResponse(
                    path=file_path,
                    filename=f"download_{datetime.now().strftime('%Y%m%d%H%M%S')}_{filename}"
                )
    return response

if __name__ == "__main__":
    uvicorn.run("main:app", port=8000, reload=True)

ソースコードの解説

上記のPGは以下のURLにアクセスするとファイルをダウンロードすることができます。

http://127.0.0.1:8000/files/hoge.txt

@app.get("/files/{filename:path}")
async def download_file(filename: str):

filesの後のパスパラメーターにファイル名を入れるわけですね。

currrentに現在のディレクトリ位置を設定
file_pathにファイルのディレクトリ絶対パスが設定されます。

current = Path()
file_path = current / "files" / filename

FileResponseに必要なファイルのパスを設定
ダウンロードする際の名前を「download_現在日時_filename」としています。

最後にFileResponseオブジェクトを返却するとユーザーのブラウザ上ではダウンロードが開始されます。

 response = FileResponse(
                    path=file_path,
                    filename=f"download_{datetime.now().strftime('%Y%m%d%H%M%S')}_{filename}"
                )
return response

FileResponse()についてはドキュメントを見るのが分かりやすいと思います。
コチラを参考にしてみてください。

最後に

今回はファイルをダウンロードする際の方法について説明してみました。
アップロードする際の方法については以下で説明していますので、よければご覧ください。

FastAPIでファイルのアップロードを行う方法

ではでは〜

FastAPI,Python

Posted by sena