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

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

Barbara Streisand
Barbara StreisandOriginal
2024-10-31 20:25:17995Durchsuche

How to Download a File after POSTing Data Using FastAPI?

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

Bei der Arbeit mit FastAPI und der Dateiverwaltung besteht eine häufige Aufgabe darin, Benutzern das Herunterladen einer Datei nach dem Senden zu ermöglichen Daten über eine POST-Anfrage. Dies kann erreicht werden, indem die FileResponse-Klasse verwendet und die richtige Konfiguration von Headern und Inhaltstypen sichergestellt wird.

Im unten bereitgestellten Code zeigen wir, wie man einen POST-Endpunkt einrichtet, der Daten verarbeitet und ein Audio zurückgibt Datei (MP3) zum Download. Wir verwenden den Datentyp „Form“, um Benutzereingaben zu erfassen und die Audiodatei zu generieren.

Option 1: Verwenden eines separaten Download-Endpunkts

Bei diesem Ansatz erstellen wir einen separaten Endpunkt für Verarbeitung von Dateidownloads.

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

Der GET-Endpunkt dient als Hauptseite, während der POST-Endpunkt Benutzereingaben verarbeitet und die Audiodatei generiert. Die FileResponse sorgt dafür, dass die entsprechenden Header für den Dateidownload festgelegt werden.

In Ihrer Vorlage können Sie einen Link hinzufügen, um den Dateidownload auszulösen:

<code class="html"><!DOCTYPE html>
<html>
  <head>
    <title>Download File</title>
  </head>
  <body>
    <a href="{{ url_for('text2speech') }}">Download File</a>
  </body>
</html></code>

Option 2: In-Endpoint-Datei Herunterladen

Alternativ können Sie den Dateidownload innerhalb desselben Endpunkts durchführen, der die Daten verarbeitet:

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

In In Ihrer Vorlage können Sie JavaScript verwenden, um den Dateidownload mithilfe des vom Endpunkt zurückgegebenen Dateipfads auszulösen:

<code class="html"><script>
  const filepath = "{{ filepath }}";
  window.location.href = filepath;
</script></code>

Umgang mit großen Dateien

Für Dateien, die die Speichergrenzen überschreiten, können Sie StreamingResponse verwenden:

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

Dateien nach dem Download löschen

Um eine Ansammlung von Speicherplatz auf der Festplatte zu verhindern, empfiehlt es sich, Dateien nach dem Herunterladen zu löschen heruntergeladen wurde. Mit BackgroundTasks können Sie das Löschen von Dateien als Hintergrundaufgabe planen:

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

Das obige ist der detaillierte Inhalt vonWie lade ich eine Datei herunter, nachdem ich Daten mit 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