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 파일이 삭제된 것을 확인할 수 있습니다.
'🟡 Ops' 카테고리의 다른 글
Amazon EC2에서 PM2와 Nginx로 JS 풀스택(백엔드/프론트엔드) 앱 배포하기 - 02 (0) | 2024.09.20 |
---|---|
Amazon EC2에서 PM2와 Nginx로 JS 풀스택(백엔드&프론트엔드) 앱 배포하기 - 01 (1) | 2024.09.19 |
AWS 클라우드 자격증(SAA-C03) 시험 특징 및 시험 후기 (0) | 2024.04.23 |
Postgres가 데이터베이스 시장을 지배하고 있다: Postgres is eating the database world (3) | 2024.03.19 |
AWS Solutions Architect Associate(SAA-C03) 기출문제 정리 - 04 (0) | 2024.01.03 |
댓글