[python] FastAPI에서 파일 업로드 및 다운로드 구현하기

FastAPI는 Python으로 작성된 현대적이고 빠른 웹 프레임워크입니다. 이 프레임워크를 사용하면 파일 업로드와 다운로드와 같은 파일 처리 작업을 쉽게 구현할 수 있습니다. 이번 블로그 포스트에서는 FastAPI를 사용하여 파일 업로드와 다운로드를 구현하는 방법을 알아보겠습니다.

파일 업로드 구현하기

먼저, FastAPI에서 파일 업로드를 구현하는 방법을 알아보겠습니다. 다음은 파일을 업로드하는 엔드포인트를 가지고 있는 FastAPI 애플리케이션의 예시입니다.

from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
    contents = await file.read()
    # 파일 처리 로직 구현
    return {"filename": file.filename}

위의 예시 코드에서 /upload/ 엔드포인트는 UploadFile 형식의 file 매개변수를 받습니다. 이를 통해 클라이언트로부터 업로드된 파일을 받아올 수 있습니다. 파일을 읽기 위해 await file.read()를 사용하고, 이후에 파일을 처리하는 로직을 구현할 수 있습니다.

파일 다운로드 구현하기

이제, FastAPI에서 파일 다운로드를 구현하는 방법을 알아보겠습니다. 다음은 파일을 다운로드하는 엔드포인트를 가지고 있는 FastAPI 애플리케이션의 예시입니다.

from fastapi import FastAPI, File, Response

app = FastAPI()

@app.get("/download/")
async def download_file():
    # 파일 경로를 가져오는 로직 구현
    file_path = "/path/to/file.jpg"
    
    # 파일을 응답으로 보내기
    response = Response(content_type='application/octet-stream')
    response.headers["Content-Disposition"] = "attachment; filename=file.jpg"
    with open(file_path, "rb") as file:
        response.body = file.read()
    
    return response

위의 예시 코드에서 /download/ 엔드포인트는 원하는 파일을 다운로드할 수 있는 경로를 반환합니다. 파일의 경로를 가져오는 로직을 구현한 후, Response 객체를 생성하여 파일을 응답으로 보냅니다. content_type은 다운로드할 파일의 MIME 유형을 설정하고, Content-Disposition 헤더를 사용하여 다운로드할 파일의 이름을 설정합니다. 마지막으로, with open(file_path, "rb") as file:을 사용하여 파일을 읽고, response.body에 설정하여 파일의 내용을 응답 바디에 저장합니다.

마치며

이번 포스트에서는 FastAPI를 사용하여 파일 업로드와 다운로드를 구현하는 방법을 알아보았습니다. FastAPI는 간편한 API 개발을 위한 강력한 도구이며, 파일 처리를 포함한 다양한 작업을 빠르고 쉽게 구현할 수 있습니다.

FastAPI 문서