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):
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 해준다.
- 보통 위와 같은 과정에서 파일을 읽고 쓰고 등등 다양한 기능을 수행할 때 어려움이 있따면 파이썬의 컨텍스트 매니저를 참고해서 개발하면 된다.