군침이 싹 도는 코딩

S3에 이미지 업로드하는 API 본문

Python/Flask

S3에 이미지 업로드하는 API

mugoori 2023. 1. 12. 16:02

# 이미지를 담을 버킷을 S3에서 하나 만든다

 

 

 

# API 를 설계해준다 이미지를 보내는거기때문에 메소드는 POST로하고 url을 정해준다

그리고 바디부분에 form-data로 체크하고 키값에 photo라고 쓴뒤 옆을보면 text와 file이 있는데 file을 눌러주고

벨류에 보낼 사진을 넣는다

 

 

 

from flask import Flask, request
from flask_restful import Resource
from mysql.connector import Error
from mysql_connection import get_connection
from flask_jwt_extended import jwt_required
from flask_jwt_extended import get_jwt_identity
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']
        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 )
        client = boto3.client('s3', aws_access_key_id = Config.ACCESS_KEY , aws_secret_access_key = Config.SECRET_ACCESS )

        try :
            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}

# 비쥬얼 스튜디오로 와서 해당 순서대로 코딩을 한다

 

 

 

# 실행해보니 정상작동하여 url을 리턴하였다

 

 

 

 

# 결과로 나온 url을 눌러 샌드를 해보면 사진이 잘 나오는것을 확인할 수 있다

 

 

 

# S3 버킷에서도 잘 확인 할 수 있다