본문 바로가기
FastAPI tips

UploadFile, 이미지 form-data

by 스티브 십잡스 2024. 3. 28.

이미지 등의 파일을 업로드할 때는 form-data로 데이터를 받습니다.

"file": {
    "filename": "test.jpg",
    "file": {
        "_file": {},
        "_max_size": 1048576,
        "_rolled": false,
        "_TemporaryFileArgs": {
            "mode": "w+b",
            "buffering": -1,
            "suffix": null,
            "prefix": null,
            "encoding": null,
            "newline": null,
            "dir": null,
            "errors": null
        }
    },
    "size": 7487,
    "headers": {
        "content-disposition": "form-data; name=\"file\"; filename=\"test.jpg\"",
        "content-type": "image/jpeg"
    }
}
  • FastAPI UploadFile 객체의 속성들입니다.

 

from fastapi import APIRouter, Depends, Request
from schemas import ClassName

@router.post(
    "/files",
    response_model=ApiResponse,
    summary="파일 업로드"
)
async def upload_file(
    command: ClassName = Depends(ClassName.as_form),
    ...
): 
    print(f"form-data: {command}")
    ...
  • 일반적으로 form-data를 처리하는 POST 요청의 예시입니다.

 

from pydantic import BaseModel
from fastapi import Form, UploadFile, File

class ClassName(BaseModel):
    id: int
    content: str
    file: UploadFile
    # file: UploadFile | None # nullable
    files: list[UploadFile | str | None]
	
    @classmethod
    def as_form(cls,
        id: int = Form(),
        content: str = Form(),
        file: UploadFile = File(),
        # file: UploadFile | None = None, # nullable
        files: list[UploadFile] = File(default=[]),
        # files: list[UploadFile] = [],
    ):
        allowed_extensions = ('jpg', 'jpeg', 'png')
        for img in files:
            if isinstance(img, UploadFile):
                extension = img.filename.split('.')[-1]
                extension = extension.lower()
                if extension not in allowed_extensions:
                    raise ValueError("확장자 에러")
                
        return cls(
            id=id,
            content=content,
            file=file,
            files=files,
        )
  • 주의사항
    • 단일 객체일 때는 File 생성자
    • Optional일 때는 None으로 초기화
    • list 객체일 때는 빈 리스트로 초기화 또는 File 생성자의 기본 값 속성을 빈 리스트로 초기화
    • 요청 값 Validation은 팩토리 메서드 내에서 해야 한다.

'FastAPI tips' 카테고리의 다른 글

Jinja2 템플릿 활용  (0) 2024.05.08
Excel 다운로드 API  (0) 2024.05.08
Middleware 커스텀해서 사용하기  (0) 2024.05.03
Request에서 form-data, query-string 가져오기  (0) 2024.03.28