使用 FastAPI 和文件处理时,一项常见任务是让用户在提交后下载文件通过 POST 请求获取数据。这可以通过利用 FileResponse 类并确保标头和内容类型的正确配置来实现。
在下面提供的代码中,我们将演示如何设置处理数据并返回音频的 POST 端点文件(MP3)供下载。我们将使用表单数据类型来捕获用户输入并生成音频文件。
在此方法中,我们将为处理文件下载。
<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>
GET 端点用作主页,而 POST 端点处理用户输入并生成音频文件。 FileResponse 负责为文件下载设置适当的标头。
在模板中,您可以添加一个链接来触发文件下载:
<code class="html"><!DOCTYPE html> <html> <head> <title>Download File</title> </head> <body> <a href="{{ url_for('text2speech') }}">Download File</a> </body> </html></code>
或者,您可以在处理数据的同一端点内处理文件下载:
<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>
在模板中,您可以使用 JavaScript 使用从返回的文件路径触发文件下载端点:
<code class="html"><script> const filepath = "{{ filepath }}"; window.location.href = filepath; </script></code>
对于超出内存限制的文件,可以使用 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>
为了防止磁盘空间累积,最好在下载文件后将其删除。使用BackgroundTasks,您可以将文件删除安排为后台任务:
<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>
以上是如何使用 FastAPI 发布数据后下载文件?的详细内容。更多信息请关注PHP中文网其他相关文章!