これはfast APIの公式githubで似たようなディスカッションが行われていますね。
下記です。
https://github.com/tiangolo/fastapi/discussions/4261
結論としては複数ファイルのダウンロードはできないから、下記の2パターンのどれかで対応することになると思います。
・zipに圧縮して返却する
・ダウンロード数だけAPIを叩く
zipダウンロードはこんな感じで出来ます。
python
1from fastapi import FastAPI
2import zipfile
3from io import BytesIO
4from fastapi.responses import StreamingResponse
5
6app = FastAPI()
7
8@app.get("/")
9async def download_file():
10 file_list = ['file1.txt', 'file2.txt']
11 return zipfiles(file_list)
12
13def zipfiles(file_list):
14 io = BytesIO()
15 zip_sub_dir = "final_archive"
16 zip_filename = "%s.zip" % zip_sub_dir
17 with zipfile.ZipFile(io, mode='w', compression=zipfile.ZIP_DEFLATED) as zip:
18 for fpath in file_list:
19 zip.write(fpath)
20 zip.close()
21 return StreamingResponse(
22 iter([io.getvalue()]),
23 media_type="application/x-zip-compressed",
24 headers = { "Content-Disposition":f"attachment;filename=%s" % zip_filename}
25 )
大体のブラウザは複数ダウンロードを許容していないので、複数ダウンロードは厳しいと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。