Maison  >  Article  >  développement back-end  >  Comment télécharger un fichier après avoir publié des données dans FastAPI ?

Comment télécharger un fichier après avoir publié des données dans FastAPI ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 11:03:01437parcourir

How to Download a File After POSTing Data in FastAPI?

Comment télécharger un fichier après avoir publié des données avec FastAPI

Problème

Vous créez une application Web qui gère la saisie de texte et la convertit en discours et renvoie un fichier audio à télécharger. Vous avez besoin d'une option de téléchargement sur la page HTML, mais vous ne pouvez pas l'implémenter correctement.

Dans Flask, une configuration similaire pourrait être réalisée en utilisant la fonction send_file. Comment répliquer cette fonctionnalité avec FastAPI ?

Code FastAPI et exemple 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>

Solution

Option 1 : Utilisez le Mot-clé de formulaire pour garantir les paramètres requis. Au lieu d'utiliser wait request.form() et de vérifier manuellement les paramètres requis, utilisez Form(...) pour rendre les paramètres obligatoires. Après avoir traité les données reçues, utilisez FileResponse pour renvoyer le fichier, en définissant l'en-tête Content-Disposition sur « pièce jointe ».

Option 2 : Vous pouvez également prendre en charge les requêtes GET et POST pour le point de terminaison /text2speech en utilisant des décorateurs comme @app.api_route("/text2speech", METHODS=["GET", "POSTE"]). Vous pouvez également définir des points de terminaison distincts avec @app.get("/text2speech") et @app.post("/text2speech").

De plus, vous pouvez éventuellement configurer une interface JavaScript à l'aide de l'API Fetch pour télécharger le fichier dans le frontend.

Remarque :

  • Si vous souhaitez renvoyer un fichier volumineux qui ne rentre pas dans la mémoire, utilisez StreamingResponse pour traiter le fichier en morceaux.
  • Pour supprimer un fichier après son téléchargement, créez une BackgroundTask à exécuter après avoir renvoyé la réponse.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn