如何在 FastAPI 中发布数据后下载文件?

Linda Hamilton
发布: 2024-10-31 11:03:01
原创
436 人浏览过

How to Download a File After POSTing Data in FastAPI?

如何使用 FastAPI 发布数据后下载文件

问题

您正在创建一个处理文本输入的 Web 应用程序,将其转换为语音,并返回音频文件以供下载。您需要在 HTML 页面上提供下载选项,但无法正确实现它。

在 Flask 中,可以使用 send_file 函数实现类似的设置。如何使用 FastAPI 复制此功能?

FastAPI 代码和 HTML 示例

<code class="python">from fastapi import FastAPI, File, Form, UploadFile
from fastapi.responses import FileResponse, HTMLResponse
from fastapi.templating import Jinja2Templates
from gtts import gTTS

templates = Jinja2Templates(directory="templates")

def text_to_speech(language: str, text: str) -> str:
    tts = gTTS(text=text, lang=language, slow=False)
    tts.save("./temp/welcome.mp3")
    return "Text to speech conversion successful"

@app.get("/")
def home(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})

@app.post("/text2speech")
async def home(request: Request):
    if request.method == "POST":
        form = await request.form()
        if form["message"] and form["language"]:
            language = form["language"]
            text = form["message"]
            translate = text_to_speech(language, text)
            path = "./temp/welcome.mp3"
            value = FileResponse("./temp/welcome.mp3", media_type="audio/mp3")
            return value</code>
登录后复制
<code class="html"><!doctype html>
<title>Download MP3 File</title>
<h2>Download a file</h2>
<p><a href="{{ url_for('text2speech') }}">Download</a></p></code>
登录后复制

解决方案

选项 1: 使用表单关键字确保所需参数。使用 Form(...) 使参数成为强制参数,而不是使用 wait request.form() 并手动检查所需参数。处理接收到的数据后,使用 FileResponse 返回文件,将 Content-Disposition 标头设置为“附件”。

选项 2: 您还可以使用@app.api_route("/text2speech",methods=["GET", “邮政”])。或者,您可以使用 @app.get("/text2speech") 和 @app.post("/text2speech") 定义单独的端点。

此外,您可以选择使用 Fetch API 设置 JavaScript 接口来在前端下载文件。

注意:

  • 如果要返回一个无法放入内存的大文件,请使用 StreamingResponse 分块处理该文件。
  • 要在下载后删除文件,请创建一个要在返回后运行的BackgroundTask回复。

以上是如何在 FastAPI 中发布数据后下载文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!