API 개발/AWS S3 & Rekognition API 파일 업로드

Restful API : AWS boto3 로 S3에 파일 업로드 하기

신강희 2024. 5. 30. 12:21
728x90

< boto3 로 S3에 파일 업로드 하기 >

# Boto3 란??

- Boto3는 Python 프로그래밍 언어를 위한 AWS SDK(Software Development Kit)

- Boto3를 사용하면 Python 애플리케이션에서 Amazon Web Services(AWS)의 다양한 서비스와 쉽게 상호 작용할 수 있다.

- Boto3는 AWS의 API를 Python 코드로 쉽게 호출할 수 있도록 해주는 라이브러리로, S3, EC2, DynamoDB, Rekognition 등 다양한 AWS 서비스와 연동할 수 있다.

 

# 그럼 이제 코드로 사용해보자! 우선 이미지를 업로드할 버킷을 생성하여야 한다.

- 참고 : https://sorktjrrb.tistory.com/157

 

AWS S3 : S3 스토리지 사용 방법 (버킷 생성)

# Amazon S3(Amazon Simple Storage Service) - AWS에서 제공하는 객체 스토리지 서비스로 인터넷 규모의 데이터를 저장하고 검색할 수 있도록 설계 - 다양한 데이터 저장 요구를 충족할 수 있는 강력하고 유

sorktjrrb.tistory.com

 

# 이제 Postman을 실행시켜 API 설계 및 리퀘스트 생성

- POST로 생성

- 중요한점! Body에 form-data로 설정후, 업로드할 사진파일은 File로 올리고, 설명문은 Text 형식으로 작성

 

# Visual Studio Code를 실행해서 코드 작성!

- 서버 배포에 필요한 파일들은 이전 프로젝트에서 복사하였고, app.py와 resources 파일만 새로 작성!

 

# image.py 파일

- boto3 install도 필요하다!

   # S3에 파일을 업로드한다.
   # aws의 서비스들을 파이썬코드로 작성할수 있는
   # boto3 라이브러리를 이용해서 코드를 작성한다.
   
   pip install boto3
 
from flask import request
from flask_restful import Resource

from datetime import datetime

import boto3

from config import Config

class FileUploadResource(Resource) :

    def post(self):

        # 1. 클라이언트로부터 데이터를 받아온다.
        #    파일은 request.files 안에 있고,
        #    텍스트는 request.form 안에 있다.

        if 'photo' not in request.files :
            return {'result' : 'fail' ,
                    'error' : '파일을 업로드 하세요.'}, 400
        if 'content' not in request.form :
            return {'result' : 'fail' ,
                    'error' : '내용을 작성하세요.'}, 400        
       
        file = request.files['photo']

        # 파일 형식이 맞는지 검토가 필요하다.
        if 'image' not in file.content_type :
            return {'result' : 'fail',
                    'error' : '이미지 파일만 업로드 가능합니다.'}, 400

        print(file)

        content = request.form['content']

        print(content)

        # 파일을 S3에 업로드해야 하는데,
        # 먼저, 파일명은 유니크 해야 한다.
        # 따라서 유니크한 파일명으로 바꿔서 업로드 한다.

        # 현재시간과 유저아이디 등을 조합해서 만든다.
        current_time = datetime.now()

        # 윈도우에선 : 을 파일로 생성하지 못하기 때문에 저장을 위해서 isoformat을 진행하고 : 을 _로 바꿔준다.
        # 유저가 올린 파일 확장자명을 그대로 쓰고 싶으면, file.content_type.split('/') or .jpg 이렇게 구문만 적어서 정해줄수도 있다.
        file_name = current_time.isoformat().replace(':','_') + '.' + file.content_type.split('/')[-1]

        print(file_name)

        # 유저가 업로드한 파일명을, 내가 만든파일명으로 바꾼다.
        file.filename = file_name

        # S3에 파일을 업로드한다.
        # aws의 서비스들을 파이썬코드로 작성할수 있는
        # boto3 라이브러리를 이용해서 코드를 작성한다.
        # 설치는 $ pip install boto3

        client = boto3.client('s3',
                    aws_access_key_id = Config.AWS_ACCESS_KEY,
                    aws_secret_access_key = Config.AWS_SECRET_ACCESS_KEY)
       
        try :
            client.upload_fileobj(file,
                                  Config.S3_BUCKET,
                                  file_name,
                                  ExtraArgs = {'ACL' : 'public-read',
                                               'ContentType' : file.content_type})
            print('upload_fileobj')
        except Exception as e :
            return {'result' : 'fail',
                    'error' : str(e)}, 500

        return {'result' : 'success',
                'url' : Config.S3_URL + file_name}
 

 

# app.py 파일에 연결 경로 작성

 
from flask import Flask
from flask_restful import Api

from resources.image import FileUploadResource
from resources.rekognition import ObjectDetectionResource

app = Flask(__name__)

api = Api(app)

# 경로와 리소스를 연결하는 코드 작성
api.add_resource( FileUploadResource , '/upload')
api.add_resource( ObjectDetectionResource , '/object_detection')

if __name__ == '__main__':
    app.run()
 

 

# Postman 실행시켜서 업로드 확인!

 

# 이제 이 업로드한 파일은 생성하였던 AWS S3버킷에서도 확인 가능!

- 버킷 리스트에서 업로드한 버킷을 선택하여서 객체 진입후 새로고침을 하면 업로드된 파일 확인 가능

 

다음 게시글로 계속~!

 

반응형