FastAPI とファイル処理を使用する場合、一般的なタスクの 1 つは、ユーザーが送信後にファイルをダウンロードできるようにすることです。 POST リクエストを通じてデータを送信します。これは、FileResponse クラスを利用し、ヘッダーとコンテンツ タイプを適切に構成することで実現できます。
以下のコードでは、データを処理してオーディオを返す POST エンドポイントを設定する方法を示します。ファイル(MP3)をダウンロードします。フォーム データ タイプを使用してユーザー入力をキャプチャし、オーディオ ファイルを生成します。
このアプローチでは、ファイルのダウンロードを処理します。
<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>
または、データを処理する同じエンドポイント内でファイルのダウンロードを処理できます。
<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 サイトの他の関連記事を参照してください。