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