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

Barbara Streisand
發布: 2024-10-31 20:25:17
原創
1005 人瀏覽過

How to Download a File after POSTing Data Using FastAPI?

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

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!