이미지 등의 파일을 업로드할 때는 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 |