Notice
Recent Posts
Recent Comments
Link
헬창 개발자
FastAPI : 파일 처리 본문
FastAPI를 사용한 파일 처리 (업로드/다운로드)
FastAPI는 비동기 기반의 빠르고 유연한 웹 프레임워크로, 파일 업로드 및 다운로드와 같은 기능을 쉽게 구현할 수 있습니다. 이 글에서는 파일 업로드와 다운로드를 FastAPI를 통해 구현하는 방법을 알아보고, 파일 처리 시 UUID를 활용해 중복되지 않는 파일명을 만드는 방법까지 설명하겠습니다.
FastAPI 파일 업로드의 기본 개념
FastAPI에서 uploadFile 이라는 타입을 사용하여 파일을 처리합니다. 이 클래스는 파일 이름, 내용, 메타데이터 등을 관리할 수 있게 해줍니다. 이를 통해 비동기 방식으로 파일을 처리하므로 효율적이고 빠릅니다.
예제
- 파일 업로드
import os
import shutil
from uuid import uuid4
from fastapi import FastAPI, File, UploadFile
from pydantic import BaseModel
app = FastAPI()
# 파일이 저장될 디렉토리
UPLOAD_DIRECTORY = "./uploads"
os.makedirs(UPLOAD_DIRECTORY, exist_ok=True) # 디렉토리가 없으면 생성
# 파일 정보를 반환하는 Pydantic 모델
class FileInfo(BaseModel):
user_filename: str
filename: str
file_id: str
@app.post("/upload", response_model=FileInfo)
async def upload_file(file: UploadFile = File(...)) -> FileInfo:
# 고유한 파일 ID 생성
file_id = str(uuid4())
file_extension = os.path.splitext(file.filename)[1] # 파일 확장자 추출
new_filename = f"{file_id}{file_extension}" # 고유 ID + 확장자로 파일 이름 생성
file_path = os.path.join(UPLOAD_DIRECTORY, new_filename) # 저장 경로 지정
# 파일 저장
with open(file_path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer) # 업로드된 파일을 저장
# 파일 정보를 반환
return FileInfo(
user_filename=file.filename,
filename=new_filename,
file_id=file_id
)
UploadFile : FastAPI에서 파일을 다루기 위한 클래스 입니다. 메모리나 디스크에 파일을 직접 저장하지 않고 스트림으로 처리하여 효율적인 파일 처리를 가능하게 합니다.
UUID : 업로드된 파일의 이름을 고유하게 만들기 위해 사용합니다.
파일 저장 : shutil.copyfileobj()를 사용하여 파일을 디스크에 저장합니다.
반환 값
- 파일 다운로드
@app.get("/download/{fimename}")
async def download_file(filename: str):
file_path = os.path.join(UPLOAD_DIRECTORT, filename)
if os.path.exists(file_path):
return FileResponse(file_path, filename=filename)
else:
raise HTTPException(status_code=400, detail="파일을 못찾겠다~~~~~")
반환 값
'공부방' 카테고리의 다른 글
[논문 리뷰] From Local to Global: A Graph RAG Approach to Query-Focused Summarization (0) | 2024.12.23 |
---|---|
WSL 환경 localhost는 통신이 되지만, Host IP는 통신이 안되는 현상 (0) | 2024.12.18 |
FastAPI Pydantic : 데이터 검증 및 설정 (1) | 2024.09.06 |
How much need VRAM by using LLM? (0) | 2024.09.05 |
도메인 특화 언어 모델 구축 어떤 방법이 좋을까? (1) | 2024.09.04 |
Comments