How to Download a File After POSTing Data in FastAPI?

Linda Hamilton
Release: 2024-10-31 11:03:01
Original
465 people have browsed it

How to Download a File After POSTing Data in FastAPI?

How to Download a File After POSTing Data with FastAPI

Problem

You're creating a web app that handles text input, converts it to speech, and returns an audio file for download. You need a download option on the HTML page, but you can't implement it properly.

In Flask, a similar setup could be achieved using the send_file function. How do you replicate this functionality with FastAPI?

FastAPI Code and HTML Example

<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>
Copy after login
<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>
Copy after login

Solution

Option 1: Use the Form keyword to ensure required parameters. Instead of using await request.form() and manually checking for required parameters, use Form(...) to make parameters mandatory. After processing the received data, use FileResponse to return the file, setting the Content-Disposition header to 'attachment.'

Option 2: You can also support both GET and POST requests for the /text2speech endpoint by using decorators like @app.api_route("/text2speech", methods=["GET", "POST"]). Alternatively, you can define separate endpoints with @app.get("/text2speech") and @app.post("/text2speech").

Additionally, you can optionally set up a JavaScript interface using Fetch API to download the file in the frontend.

Note:

  • If you want to return a large file that doesn't fit into memory, use StreamingResponse to process the file in chunks.
  • To remove a file after it's downloaded, create a BackgroundTask to be run after returning the response.

The above is the detailed content of How to Download a File After POSTing Data in FastAPI?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!