>  기사  >  백엔드 개발  >  FastAPI를 사용하여 데이터 게시 후 파일을 다운로드하는 방법은 무엇입니까?

FastAPI를 사용하여 데이터 게시 후 파일을 다운로드하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-31 20:25:17995검색

How to Download a File after POSTing Data Using FastAPI?

FastAPI를 사용하여 데이터 게시 후 파일을 다운로드하는 방법은 무엇입니까?

FastAPI 및 파일 처리 작업을 할 때 일반적인 작업 중 하나는 사용자가 제출한 후 파일을 다운로드할 수 있도록 하는 것입니다. POST 요청을 통해 데이터를 전송합니다. 이는 FileResponse 클래스를 활용하고 헤더 및 콘텐츠 유형의 적절한 구성을 보장함으로써 달성할 수 있습니다.

아래 제공된 코드에서는 데이터를 처리하고 오디오를 반환하는 POST 엔드포인트를 설정하는 방법을 보여줍니다. 다운로드용 파일(MP3)입니다. 양식 데이터 유형을 사용하여 사용자 입력을 캡처하고 오디오 파일을 생성합니다.

옵션 1: 별도의 다운로드 엔드포인트 사용

이 접근 방식에서는 파일 다운로드를 처리합니다.

<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>

옵션 2: 엔드포인트 내 파일 다운로드

또는 데이터를 처리하는 동일한 엔드포인트 내에서 파일 다운로드를 처리할 수 있습니다.

<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.