Heim  >  Artikel  >  Backend-Entwicklung  >  Wie lade ich eine Datei herunter, nachdem ich Daten in FastAPI gepostet habe?

Wie lade ich eine Datei herunter, nachdem ich Daten in FastAPI gepostet habe?

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 11:03:01437Durchsuche

How to Download a File After POSTing Data in FastAPI?

So laden Sie eine Datei herunter, nachdem Sie Daten mit FastAPI gepostet haben

Problem

Sie erstellen eine Web-App, die Texteingaben verarbeitet und in umwandelt Rede und gibt eine Audiodatei zum Herunterladen zurück. Sie benötigen eine Download-Option auf der HTML-Seite, können diese aber nicht richtig implementieren.

In Flask könnte ein ähnliches Setup mit der Funktion send_file erreicht werden. Wie replizieren Sie diese Funktionalität mit FastAPI?

FastAPI-Code und HTML-Beispiel

<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>

Lösung

Option 1:Verwenden Sie die Formularschlüsselwort, um erforderliche Parameter sicherzustellen. Anstatt „await request.form()“ zu verwenden und manuell nach erforderlichen Parametern zu suchen, verwenden Sie „Form(...)“, um Parameter obligatorisch zu machen. Nachdem Sie die empfangenen Daten verarbeitet haben, verwenden Sie FileResponse, um die Datei zurückzugeben, und setzen Sie den Content-Disposition-Header auf „attachment“.

Option 2: Sie können auch sowohl GET- als auch POST-Anfragen für den /text2speech-Endpunkt unterstützen, indem Sie Dekoratoren wie @app.api_route("/text2speech", method=["GET", "POST"]). Alternativ können Sie mit @app.get("/text2speech") und @app.post("/text2speech") separate Endpunkte definieren.

Zusätzlich können Sie optional eine JavaScript-Schnittstelle mithilfe der Fetch-API einrichten, um die Datei im Frontend herunterzuladen.

Hinweis:

  • Wenn Sie eine große Datei zurückgeben möchten, die nicht in den Speicher passt, verwenden Sie StreamingResponse, um die Datei in Blöcken zu verarbeiten.
  • Um eine Datei nach dem Herunterladen zu entfernen, erstellen Sie eine Hintergrundaufgabe, die nach der Rückgabe der Antwort ausgeführt wird.

Das obige ist der detaillierte Inhalt vonWie lade ich eine Datei herunter, nachdem ich Daten in FastAPI gepostet habe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn