AWS

AWS S3 에 이미지 업로드하기

yugyeong 2023. 1. 12. 16:02

1. S3에 버킷 생성

AWS 의 S3 에 접속하여서 버킷을 생성한다.

  • 객체 소유권에서 ACK 활성화 선택
  • 모든 퍼플릭 억세스 차단 해제
  • 버킷 생성

 

 

2. 코드 작성

  • vs code 로 이동하여서, AWS S3 에 이미지를 업로드 하는 코드를 작성하였다.
  • S3에 파일을 업로드 하는 라이브러리 boto3 를 설치한다.
pip install boto3
  • 노출이 되면 안되는 정보들을 config 파일에 변수로 저장하였다.

 

from flask import request
from flask_jwt_extended import jwt_required
from flask_restful import Resource
from mysql.connector import Error
from flask_jwt_extended import get_jwt_identity
from mysql_connection import get_connection

from datetime import datetime
import boto3
from config import Config


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

        # 1. 클라이언트로부터 데이터를 받아온다.
        # request.files 에 파일이 들어있다.

        if 'photo' not in request.files :
            return {'error' : '파입 업로드 하세요.'}, 400

        file = request.files['photo']
        print(file)

        # 클라이언트가 보낸 파일의 파일명을 
        # 변경시켜서 s3에 올려야, 유니크하게 파일을 관리할 수 있다.

        # 파일명을 유니크하게 만드는 방법
        current_time = datetime.now()
        new_file_name = current_time.isoformat().replace(":", "_") + '.jpg'

        print(new_file_name)

        # 파일명을, 유니크한 이름으로 변경한다,
        # 클라이언트에서 보낸 파일명을 대체!

        file.filename = new_file_name

        # S3 에 파일을 업로드 하면 된다.
        # S3 에 파일 업로드 하는 라이브러리가 필요
        # 따라서, boto3 라이브러리를 이용해서 업로드 한다.
        # ( 참고. 라이브러리 설치는 pip install boto3 )

        # 첫번째 파라미터에는 aws 의 서비스 이름을 써주면 된다. ex) ec2, s3 ...
        client = boto3.client('s3', 
                    aws_access_key_id = Config.ACCESS_KEY,
                    aws_secret_access_key= Config.SECRET_ACCESS)

        try :
            # 이미지 파일 변수, aws의 버킷명=> 보안상 config 파일에 변수로 저장, 파일명, 모두가 읽을 수 있게 그리고 파일타입을 파라미터로 넣어줌. 
            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


        return {'result' : 'success',
                'imgUrl' : Config.S3_LOCATION + new_file_name}

 

 

3. Postman 으로 테스트

  • 포스트맨으로 테스트를 한다.
  • POST 로 설정
  • Body - form data
  • key 에는 코드에서 request 로 받은 변수 photo 를 적는다.
  • Text,File 중 File 선택

위처럼 설정을 한 후, jpg 파일을 업로드하여 실행을 하였을 때의 결과이다.

아래에서 나온 imgUrl 을 선택하면 업로드한 사진이 결과값으로 리턴된다.

 

 

AWS 의 S3 로 이동하여, 맨 처음에 생성한 버킷으로 이동해보면 위에서 실행한 jpg 파일이 업로드 되어있는 것을 확인할 수 있다.