首頁  >  文章  >  後端開發  >  如何在 FastAPI 中發布資料後下載檔案?

如何在 FastAPI 中發布資料後下載檔案?

Linda Hamilton
Linda Hamilton原創
2024-10-31 11:03:01437瀏覽

How to Download a File After POSTing Data in FastAPI?

如何使用FastAPI 發布資料後下載檔案

問題

您正在建立一個處理文字輸入的Web 應用程序,將其轉換為語音,並返回音訊檔案以供下載。您需要在 HTML 頁面上提供下載選項,但無法正確實現它。

在 Flask 中,可以使用 send_file 函數實作類似的設定。如何使用 FastAPI 複製此功能?

FastAPI 程式碼和 HTML 範例

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

templates = Jinja2Templates(directory="templates")

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

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

@app.post("/text2speech")
async def home(request: Request):
    if request.method == "POST":
        form = await request.form()
        if form["message"] and form["language"]:
            language = form["language"]
            text = form["message"]
            translate = text_to_speech(language, text)
            path = "./temp/welcome.mp3"
            value = FileResponse("./temp/welcome.mp3", media_type="audio/mp3")
            return value</code>
<code class="html"><!doctype html>
<title>Download MP3 File</title>
<h2>Download a file</h2>
<p><a href="{{ url_for('text2speech') }}">Download</a></p></code>

解決方案

選項 1: 使用表單關鍵字確保所需參數。使用 Form(...) 使參數成為強制參數,而不是使用 wait request.form() 並手動檢查所需參數。處理接收到的資料後,使用 FileResponse 傳回文件,將 Content-Disposition 標頭設定為「附件」。

選項 2: 您也可以使用@app.api_route("/text2speech",methods=["GET", “郵政”])。或者,您可以使用 @app.get("/text2speech") 和 @app.post("/text2speech") 定義單獨的端點。

此外,您可以選擇使用 Fetch API 設定 JavaScript 介面來在前端下載檔案。

注意:

  • 如果要傳回一個無法放入記憶體的大文件,請使用 StreamingResponse 分塊處理該文件。
  • 要在下載後刪除文件,請建立一個要在回傳回應後執行的後台任務。

以上是如何在 FastAPI 中發布資料後下載檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn