본문 바로가기
🟡 Ops

FastAPI로 복수 파일 업로드 API 구현하기

by 제리강 2024. 9. 6.

 

 

FastAPI에서는 File, UploadFile 객체를 이용해 간편히 프론트엔드에서 업로드한 파일을 처리할 수 있습니다.

다음 예제 코드는 사용자가 업로드한 파일을 특정 경로에 저장합니다. 전송받는 파일 타입을 List 형식으로 설정하여, 여러 파일을 업로드할 수 있도록 합니다. 

 

 

from fastapi import FastAPI, File, UploadFile, HTTPException
from typing import List
from fastapi.responses import JSONResponse
import os

app = FastAPI()

UPLOAD_DIR = "uploads"
os.makedirs(UPLOAD_DIR, exist_ok=True)

@app.post("/api/upload/")
async def upload_files(files: List[UploadFile] = File(...)):
    file_details = []
    
    for file in files:
        file_details.append({"filename": file.filename, "content_type": file.content_type})
        with open(f"{UPLOAD_DIR}/{file.filename}", "wb") as f:
            f.write(await file.read())
    
    return JSONResponse({"files": file_details})

 

 

UPLOAD_DIR 에서 경로를 지정할 수 있습니다. 여기서는 uploads 폴더에 파일을 저장합니다. 여기에 추가적으로 파일을 삭제하는 기능도 함께 구현해봅시다. 다음 예제 코드는, 사용자가 특정 파일을 선택하면 이 파일의 이름을 기준으로 파일을 삭제합니다.

 

 

@app.post("/api/delete/")
async def delete_file(filename: str):
    file_path = f"{UPLOAD_DIR}/{filename}"
    
    # 파일이 존재하는지 확인하고 삭제
    if os.path.exists(file_path):
        try:
            os.remove(file_path)
            return {"message": f"File '{filename}' has been deleted successfully."}
        except Exception as e:
            raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
    else:
        raise HTTPException(status_code=404, detail=f"File '{filename}' not found.")

 

 

이제, 다음의 코드를 마지막에 추가하여 python main.py 로 실행한 후 docs 화면에 진입해봅시다. 파일명은 upload.py 라고 가정하고, host와 post를 환경에 맞게 설정합니다.

 

if __name__ == '__main__':
    import uvicorn
    uvicorn.run('upload:app', host='0.0.0.0', port=3000, reload=True)

 

 

docs 화면은 다음과 같습니다. 각 API를 클릭해 펼친 후 Try it out을 눌러 파일 업로드를 테스트할 수 있습니다.

 

 

입력란에서 Add string item을 클릭해 여러 개의 파일을 업로드해볼 수 있습니다.

 

 

 

 

Execute를 눌러 실행하면 백엔드의 지정한 경로에 파일 저장이 잘 된것을 볼 수 있습니다. 

 

 

 

 

이제 abc.png 파일을 삭제해봅시다. /api/delete에서 abc.png를 입력한 후 execute 해봅니다.

 

 

 

정상적으로 abc.png 파일이 삭제된 것을 확인할 수 있습니다.

 

댓글