使用 FastAPI 和檔案處理時,一項常見任務是讓使用者在提交後下載檔案透過 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 發布資料後下載檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!