FastAPI を使用してデータを POST した後にファイルをダウンロードするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-31 20:25:17
オリジナル
1004 人が閲覧しました

How to Download a File after POSTing Data Using FastAPI?

FastAPI を使用してデータを POST した後にファイルをダウンロードするには?

FastAPI とファイル処理を使用する場合、一般的なタスクの 1 つは、ユーザーが送信後にファイルをダウンロードできるようにすることです。 POST リクエストを通じてデータを送信します。これは、FileResponse クラスを利用し、ヘッダーとコンテンツ タイプを適切に構成することで実現できます。

以下のコードでは、データを処理してオーディオを返す POST エンドポイントを設定する方法を示します。ファイル(MP3)をダウンロードします。フォーム データ タイプを使用してユーザー入力をキャプチャし、オーディオ ファイルを生成します。

オプション 1: 個別のダウンロード エンドポイントを使用する

このアプローチでは、ファイルのダウンロードを処理します。

<code class="python">from fastapi import FastAPI, Request, Form, File, UploadFile
from fastapi.responses import FileResponse, HTMLResponse
from fastapi.templating import Jinja2Templates
from gtts import gTTS

app = FastAPI()
templates = Jinja2Templates(directory="templates")


def text_to_speech(language: str, text: str) -> str:
    tts = gTTS(text=text, lang=language, slow=False)
    filepath = "temp/welcome.mp3"
    tts.save(filepath)
    return f"Text to speech conversion successful to {filepath}"


@app.get("/")
def home(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})


@app.post("/text2speech")
def text2speech(request: Request, message: str = Form(...), language: str = Form(...)):
    if message and language:
        output = text_to_speech(language, message)
    path = "temp/welcome.mp3"
    filename = os.path.basename(path)
    headers = {"Content-Disposition": f"attachment; filename={filename}"}
    return FileResponse(path, headers=headers, media_type="audio/mp3")</code>
ログイン後にコピー

GET エンドポイントはメイン ページとして機能し、POST エンドポイントはユーザー入力を処理してオーディオ ファイルを生成します。 FileResponse は、ファイルのダウンロードに適切なヘッダーの設定を処理します。

テンプレートに、ファイルのダウンロードをトリガーするリンクを追加できます:

<code class="html"><!DOCTYPE html>
<html>
  <head>
    <title>Download File</title>
  </head>
  <body>
    <a href="{{ url_for('text2speech') }}">Download File</a>
  </body>
</html></code>
ログイン後にコピー

オプション 2: エンドポイント ファイル内ダウンロード

または、データを処理する同じエンドポイント内でファイルのダウンロードを処理できます。

<code class="python">from fastapi import FastAPI, Request, Form

app = FastAPI()


def text_to_speech(language: str, text: str) -> str:
    tts = gTTS(text=text, lang=language, slow=False)
    filepath = "temp/welcome.mp3"
    tts.save(filepath)
    return f"Text to speech conversion successful to {filepath}"


@app.post("/text2speech")
def text2speech(request: Request, message: str = Form(...), language: str = Form(...)):
    output = text_to_speech(language, message)
    return {"filepath": filepath}</code>
ログイン後にコピー

テンプレートでは、JavaScript を使用して、から返されたファイルパスを使用してファイルのダウンロードをトリガーできます。エンドポイント:

<code class="html"><script>
  const filepath = "{{ filepath }}";
  window.location.href = filepath;
</script></code>
ログイン後にコピー

大きなファイルの処理

メモリ制限を超えるファイルについては、StreamingResponse:

<code class="python">from fastapi.responses import StreamingResponse

@app.post("/text2speech")
def text2speech(request: Request, message: str = Form(...), language: str = Form(...)):
    ...
    def iterfile():
        with open(filepath, "rb") as f:
            yield from f

    headers = {"Content-Disposition": f"attachment; filename={filename}"}
    return StreamingResponse(iterfile(), headers=headers, media_type="audio/mp3")</code>
ログイン後にコピー

ダウンロード後のファイルの削除

ディスク領域の蓄積を防ぐために、ファイルをダウンロードした後は削除することをお勧めします。 BackgroundTasks を使用すると、ファイルの削除をバックグラウンド タスクとしてスケジュールできます:

<code class="python">from fastapi import BackgroundTasks

@app.post("/text2speech")
def text2speech(request: Request, background_tasks: BackgroundTasks, ...):
    ...
    background_tasks.add_task(os.remove, path=filepath)
    return FileResponse(filepath, headers=headers, media_type="audio/mp3")</code>
ログイン後にコピー

以上がFastAPI を使用してデータを POST した後にファイルをダウンロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!