헬창 개발자

FastAPI : 파일 처리 본문

공부방

FastAPI : 파일 처리

찬배 2024. 9. 9. 15:26

FastAPI를 사용한 파일 처리 (업로드/다운로드)

FastAPI는 비동기 기반의 빠르고 유연한 웹 프레임워크로, 파일 업로드 및 다운로드와 같은 기능을 쉽게 구현할 수 있습니다. 이 글에서는 파일 업로드다운로드를 FastAPI를 통해 구현하는 방법을 알아보고, 파일 처리 시 UUID를 활용해 중복되지 않는 파일명을 만드는 방법까지 설명하겠습니다.

FastAPI 파일 업로드의 기본 개념

FastAPI에서 uploadFile 이라는 타입을 사용하여 파일을 처리합니다. 이 클래스는 파일 이름, 내용, 메타데이터 등을 관리할 수 있게 해줍니다. 이를 통해 비동기 방식으로 파일을 처리하므로 효율적이고 빠릅니다.

예제

  • 파일 업로드
import os
import shutil
from uuid import uuid4
from fastapi import FastAPI, File, UploadFile
from pydantic import BaseModel

app = FastAPI()

# 파일이 저장될 디렉토리
UPLOAD_DIRECTORY = "./uploads"
os.makedirs(UPLOAD_DIRECTORY, exist_ok=True)  # 디렉토리가 없으면 생성

# 파일 정보를 반환하는 Pydantic 모델
class FileInfo(BaseModel):
    user_filename: str
    filename: str
    file_id: str

@app.post("/upload", response_model=FileInfo)
async def upload_file(file: UploadFile = File(...)) -> FileInfo:
    # 고유한 파일 ID 생성
    file_id = str(uuid4())  
    file_extension = os.path.splitext(file.filename)[1]  # 파일 확장자 추출
    new_filename = f"{file_id}{file_extension}"  # 고유 ID + 확장자로 파일 이름 생성
    file_path = os.path.join(UPLOAD_DIRECTORY, new_filename)  # 저장 경로 지정

    # 파일 저장
    with open(file_path, "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)  # 업로드된 파일을 저장

    # 파일 정보를 반환
    return FileInfo(
        user_filename=file.filename,
        filename=new_filename,
        file_id=file_id
    )

 

UploadFile : FastAPI에서 파일을 다루기 위한 클래스 입니다. 메모리나 디스크에 파일을 직접 저장하지 않고 스트림으로 처리하여 효율적인 파일 처리를 가능하게 합니다.

 

UUID : 업로드된 파일의 이름을 고유하게 만들기 위해 사용합니다.

 

파일 저장 : shutil.copyfileobj()를 사용하여 파일을 디스크에 저장합니다.

 

반환 값

 

  • 파일 다운로드
@app.get("/download/{fimename}")
async def download_file(filename: str):
    file_path = os.path.join(UPLOAD_DIRECTORT, filename)
    if os.path.exists(file_path):
        return FileResponse(file_path, filename=filename)
    else:
        raise HTTPException(status_code=400, detail="파일을 못찾겠다~~~~~")

 

반환 값

Comments