Api 개발/flask

이미지 업로드 api 만들기

공부짱짱열심히하기 2023. 1. 12. 15:58

어플에 사진을 보내면 사진을 s3버킷안에 저장하고 관리하는 어플

먼저 s3 버킷먼저 생성

 

버킷 만들기

 

 

https://aws.amazon.com/ko/sdk-for-python/

 

Python용 AWS SDK

Python용 AWS SDK인 boto3를 사용하여 AWS를 빠르게 시작하십시오. Boto3를 사용하면 Python 애플리케이션, 라이브러리 또는 스크립트를 Amazon S3, Amazon EC2, Amazon DynamoDB 등 AWS 서비스와 쉽게 통합할 수 있습

aws.amazon.com

pip install boto3

 

lmabda에는 기본으로 설치되어있고 로컬에만 설치해주면됨

 

파일을 s3에 업로드 API

POST  / upload

form-data 로 사진 파일 전송

-photo : 사진파일

 

 

 

이때 파일을 올려서s3에 저장할때 파일명이 유니크해야지만 관리가 가능하다

항상 업로드하는 시간이 가장 유니크하다

 

from datetime import datetime

하지만 시간으로 했을경우 파일명으로 : 으로 할 수 없기때문에 형식을 바꿔줘야함

        current_time = datetime.now()
        new_file_name = current_time.isoformat().replace(':' , '_' ) + '.jpg'
        file.filename = new_file_name

유니크하게 파일명 바뀜

 

그럼 이제 파일 업로드

s3에 파일 업로드 하는 라이브러리가 필요
 따라서, boto3 라이브러리를 이용해서 업로드 한다.

 

클라이언트 서버 모델 → request + response

클라이언트(요청)  리퀘스트

서버(응답) 리스폰스

이용자가 사진 올리면 (클라이언트) lambda가 받으니까 서버

lambda가 s3에게 저장하기위해  클라이언트가 lambda  s3가 서버

이런식

        client = boto3.client('s3', 
                    aws_access_key_id = Config.ACCESS_KEY ,
                    aws_secret_access_key = Config.SECRET_ACCESS )

 

            client.upload_fileobj(file,
                                    Config.S3_BUCKET,
                                    new_file_name,
                                    ExtraArgs = {'ACL':'public-read', 'ContentType' : file.content_type } )

 

최종

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

주소 확인

 

버킷에 정상적으로 업로드