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

Barbara Streisand
Freigeben: 2024-10-31 20:25:17
Original
1004 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!