본문 바로가기
Restful API

[Restful API] 이미지와 텍스트 포스팅하는 API만들기

by coding_su 2023. 1. 13.

📝이미지와 텍스트를 포스팅하는 API만들기

우선 포스트맨을 포스트로 셋팅하고 Body에 form-data로

키값을 사진을 올릴 수 있는 파일 타입, 글을 올릴 수 있는 텍스트타입으로 하나씩 만들어줬다

Visual Studio Code를 실행해 코드를 작성해준다

사진을 S3에 업로드하고 업로드한 사진의 Url을 가져와 입력한 내용과 함께 DB에 저장해줬다

class PostingResource(Resource) :

    def post(slef) :
        # 1. 클라이언트로부터 데이터를 받아온다
        # from=data
        # photo : file
        # content : text

        # 사진과 내용은 필수항목이다 세이프코딩
        if 'photo' not in request.files or 'content' not in request.form :
            return {'error' : '데이터를 정확히 보내세요'}, 400
        
        file = request.files['photo']
        content = request.form['content']

        # 2. 사진을 먼저 S3에 저장한다
        current_time = datetime.now()
        # 콜론은 파일명에 들어갈 수 없음으로 바꿔준다(확장자 명은 올린 파일로)
        new_file_name = current_time.isoformat().replace(':', '_') + '.' + file.content_type.split('/')[-1]
        # 파일명을 유니크한 이름으로 변경한다 (클라이언트에서 보낸 파일명을 대체)
        file.filename = new_file_name
        
        # boto3 라이브러리를 이용해서 S3에 파일을 업로드 한다
        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

        # 3. 저장된 사진의 imgUrl을 만든다
        imgUrl = Config.S3_LOCATION + new_file_name

        # 4. DB에 저장한다
        try :
            connection = get_connection()

            query = '''insert into
                    posting(content, imgUrl)
                    values (%s, %s);'''

            record = (content, imgUrl)

            cursor = connection.cursor()

            cursor.execute(query, record)

            connection.commit()

            cursor.close()
            connection.close()

        except Error as e :
            print(e)
            cursor.close()
            connection.close()

            return {"error" : str(e)}, 500

        return {"result" : "success"}, 200

 

+ 파일을 업로드할때 이미지가 아닌 파일을 업로드하는 것을 방지하기 위해 세이프코딩 추가

 S3에 저장하기 전에 입력해준다

if 'image' not in file.content_type :
    return {'error' : '이미지 파일이 아닙니다.'}

 

+ {"message":"Request Entity Too Large"} 413 에러 발생

 요청이 들어오면 API게이트웨이가 람다를 실행해주는데 파일크기가 너무 커서 막아버린 것

 그럴때는 API게이트웨이를 수정해준다

댓글