본문 바로가기
  • 콩's 코딩노트
AWS

AWS S3에 boto3로 이미지 업로드 하기

by Cong_S 2022. 6. 24.

먼저 AWS에서 S3의 버킷을 먼저 만들어준다.

 

상황에 맞게 설정하여 버킷을 만든다.

(IAM으로 만든 허용된 access 키를 가지고 있으면 접근할 수 있어야하므로 ACL활성화시켜서 진행하였음. )

 

다음 코드를 작성하기 전에 포스트맨에서 request를 먼저 만들었다.

파일을 올려두고 API가 실행되면 S3에 업로드되도록 코드를 작성해보자.

 

제일 먼저 config 파일에서 코드 작성이 용이하도록 먼저 변수처리를 해주자.

 

 

pip install boto3

그 다음은 Python 에서 S3로 파일을 업로드해주는 라이브러리인 boto를 설치하고 import 해준다.

 

실행 파일에 리소스와 경로를 작성한다.

연결된 리소스 클래스의 코드는 다음과 같다.

 

class FileUploadResource(Resource):
    
    def post(self):

        # 1. 클라이언트로부터 데이터를 받아온다.
        # request.files 에 파일을 받아온다.
        # 따라서 파일이 없는 상태로 API가 호출되면, 에러메세지를 클라이언트에 응답해주자.

        # photo 란?, 클라이언트에서 보내는 key
        if 'photo' not in request.files:
            return{'error' : '파일을 업로드 하세요.'}, 400
        
        # 클라이언트로부터 파일을 받아온다.
        file = request.files['photo']

        # 파일명을 유니크하게 변경해준다.
        current_time = datetime.now()
        new_file_name = current_time.isoformat().replace(":", "_") + '.png'

        # 유저가 올린 파일의 이름을. 내가 만든 파일명으로 변경.
        file.filename = new_file_name

        # S3에 업로드하기
        # AWS의 라이브러리를 사용해야한다.
        # 그 파이썬 라이브러리는 boto3 이다.
        # pip install boto3

        # S3 연결
        s3 = boto3.client('s3', 
                    aws_access_key_id= Config.ACCESS_KEY,
                    aws_secret_access_key= Config.SECRET_ACCESS_KEY)
        # S3에 업로드
        try:
            s3.upload_fileobj(file, 
                            Config.S3_BUCKET, 
                            file.filename,
                            ExtraArgs= {'ACL':'public-read', 'ContentType':file.content_type} )
        except Exception as e:
            {'error': str(e)}, 500

        return {'result':'success',
                'ImgUrl': Config.S3_LOCATION + file.filename}

 

위 코드를 작성한 뒤 로컬에서 테스트한 모습이다.

 

 

댓글