[FastAPI] 파일처리

JeongChaeJin·2022년 7월 31일

Setting

pip install python-multipart

Bytes Stream

from fastapi import FastAPI, File

app = FastAPI()


@app.post("/file/size")
def get_filesize(file: bytes = File(...)):
    return {"file_size": len(file)}
  • File Class만 이용하면 바이트 스트림으로 받을 수 있다.

  • docs에서 확인해보니 이전 시간에 말한 것 처럼 multipart-data로 받는다.
    • 미디어 타입은 위처럼 받는다.

  • try 하면 위처럼 뜬다. 테스트가 매우 편하다.
  • 그런데 bytes로 받으면, 파일 이름 이라던지 다양한 정보를 받기 어려움이 있다.

File upload

from fastapi import FastAPI, File, UploadFile

app = FastAPI()


@app.post("/file/info")
def get_file_info(file: UploadFile = File(...)):
    return {
        "content_type": file.content_type,
        "filename": file.filename
    }

  • 위 API를 사용하면 파일을 선택하면 여러 정보를 얻을 수 있음을 확인할 수 있다.

비동기

from tempfile import NamedTemporaryFile
from typing import IO

from fastapi import FastAPI, File, UploadFile

app = FastAPI()


async def save_file(file: IO):
    # s3 업로드라고 생각해 봅시다. delete=True(기본값)이면
    # 현재 함수가 닫히고 파일도 지워집니다.
    with NamedTemporaryFile("wb", delete=False) as tempfile:
        tempfile.write(file.read())
        return tempfile.name


@app.post("/file/store")
async def store_file(file: UploadFile = File(...)):
    path = await save_file(file.file)
    return {"filepath": path}
  • 요새는 비동기 처리를 웹 프레임워크에서 대부분 지원하는 추세다.
  • 파일을 저장하는 API로 숙지해보자.
  • NameTemporary를 사용해야 file의 name을 가져올 수 있어 경로를 얻기 편하다.
  • 해당 save_file이 s3와 같은 저장소로 올려준다고 생각해보면, 보통 DB에 업로드 후 이미지를 저장하는게 아니라 해당 이미지와 같은 파일이 올라간 경로를 저장해둘 수 있게 된다.

  • docs를 통해 테스트해보면 해당 파일을 업로드하면, 임시 객체를 생성해서 file을 read하여 담고, 파일을 저장하게된다. 그리고 해당 파일의 경로를 Return 해준다.
  • 보통 위와 같은 과정에서 파일을 읽고 쓰고 등등 다양한 기능을 수행할 때 어려움이 있따면 파이썬의 컨텍스트 매니저를 참고해서 개발하면 된다.
profile
OnePunchLotto

0개의 댓글