Apabila bekerja dengan FastAPI dan pengendalian fail, satu tugas biasa adalah untuk membolehkan pengguna memuat turun fail selepas menyerahkan data melalui permintaan POST. Ini boleh dicapai dengan menggunakan kelas FileResponse dan memastikan konfigurasi pengepala dan jenis kandungan yang betul.
Dalam kod yang disediakan di bawah, kami akan menunjukkan cara menyediakan titik akhir POST yang memproses data dan mengembalikan audio fail (MP3) untuk dimuat turun. Kami akan menggunakan jenis data Borang untuk menangkap input pengguna dan menjana fail audio.
Dalam pendekatan ini, kami akan mencipta titik akhir yang berasingan untuk mengendalikan muat turun fail.
<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>
Titik akhir GET berfungsi sebagai halaman utama, manakala titik akhir POST mengendalikan input pengguna dan menjana fail audio. FileResponse menguruskan menetapkan pengepala yang sesuai untuk muat turun fail.
Dalam templat anda, anda boleh menambah pautan untuk mencetuskan muat turun fail:
<code class="html"><!DOCTYPE html> <html> <head> <title>Download File</title> </head> <body> <a href="{{ url_for('text2speech') }}">Download File</a> </body> </html></code>
Sebagai alternatif, anda boleh mengendalikan muat turun fail dalam titik akhir yang sama yang memproses data:
<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>
Dalam templat anda, anda boleh menggunakan JavaScript untuk mencetuskan muat turun fail menggunakan laluan fail yang dikembalikan daripada titik akhir:
<code class="html"><script> const filepath = "{{ filepath }}"; window.location.href = filepath; </script></code>
Untuk fail yang melebihi had memori, anda boleh menggunakan 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>
Untuk mengelakkan pengumpulan ruang cakera, adalah amalan yang baik untuk memadam fail selepas ia dimuat turun. Menggunakan BackgroundTasks, anda boleh menjadualkan pemadaman fail sebagai tugas latar belakang:
<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>
Atas ialah kandungan terperinci Bagaimana untuk Muat Turun Fail selepas Menyiarkan Data Menggunakan FastAPI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!