Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Muat Turun Fail selepas Menyiarkan Data Menggunakan FastAPI?

Bagaimana untuk Muat Turun Fail selepas Menyiarkan Data Menggunakan FastAPI?

Barbara Streisand
Barbara Streisandasal
2024-10-31 20:25:17995semak imbas

How to Download a File after POSTing Data Using FastAPI?

Bagaimana untuk Muat Turun Fail selepas Menyiarkan Data menggunakan FastAPI?

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.

Pilihan 1: Menggunakan Titik Akhir Muat Turun Berasingan

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>

Pilihan 2: Fail In-Endpoint Muat turun

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>

Mengendalikan Fail Besar

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>

Memadam Fail Selepas Muat Turun

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn