본문 바로가기
Restful API

[Restful API] 이미지 S3에 업로드하는 API 만들기

by coding_su 2023. 1. 12.

📝이미지를 S3에 업로드하는 API 만들기

우선 포스트맨에서 경로를 설정해주고 ex) http://localhost:5000/upload

Body에 form-data로 키값을 입력하고 텍스트가 아닌 파일로 지정해서 밸류값에 이미지를 업로드 해줬다

Visual Studio Code를 실행해 코드를 작성해준다

from flask import request
from flask_restful import Resource
from mysql.connector import Error
from datetime import datetime
import boto3
from config import Config

class FileUpLoadResource(Resource) :
    
    def post(self) :
        # 클라이언트로부터 데이터를 받아온다(request.files에 파일이 들어있다)
		
        # 파일이 없을 경우 에러(세이프코딩)
        if 'photo' not in request.files :
            return {'error' : '파일 업로드하세요'}, 400

        file = request.files['photo']

        # 클라이언트가 보낸 파일의 파일명을 변경시켜서 S3에 올려야 유니크하게 파일을 관리할 수 있다
        
        # 파일명을 현재시간으로 유니크하게 만드는 방법
        current_time = datetime.now()
        # 콜론은 파일명에 들어갈 수 없음으로 바꿔준다
        new_file_name = current_time.isoformat().replace(':', '_') + '.jpg'
        
        # 파일명을 유니크한 이름으로 변경한다(클라이언트에서 보낸 파일명을 대체)
        file.filename = new_file_name
        
        # boto3를 이용해서 S3에 파일을 업로드 한다(S3의 파일 업로드하는 boto3 라이브러리 필요)
        # 참고 : 라이브러리 설치는 pip install boto3
        
        # 사용할 서비스 이름을 적어주고 권한을 준다(권한은 컨픽파일에 저장해서 관리)
        client =  boto3.client('s3', aws_access_key_id= Config.ACCESS_KEY, aws_secret_access_key= Config.SECRET_ACCESS)

	# 에러가 발생할 수 있으니 try로 실행해준다
        try :
        	# 저장할 파일과 버킷명, 파일이름, ExtraArgs를 설정
            client.upload_fileobj(file, Config.S3_BUCKET, new_file_name, ExtraArgs= {'ACL' : 'public-read', 'ContentType' : file.content_type})
        
        except Exception as e :
            return {"error" : str(e)}, 500

		# 성공했을때 imgUrl값도 같이 넘겨준다
        return {"result" : "success", "imgUrl" : Config.S3_LOCATION + new_file_name}

 

포스트맨에 셋팅한데로 실행해보면 S3에 잘 업로드 되었고 이미지 Url도 잘 나온다

댓글