클라이언트가 이미지와 텍스트를 보내면 받아서 내 DB에 저장하는 포스팅 API를 만들어보자.
DB에 이미지를 저장할 때는 이미지 URL로 저장하기 때문에,
먼저 받은 이미지를 자동으로 내 AWS S3에 업로드 해야 한다.
S3에 파일 업로드 참고: https://donghyeok90.tistory.com/201
AWS S3 - 파이썬 boto3로 이미지 파일 업로드
Flask를 사용하여 클라이언트로부터 이미지 파일을 받으면 AWS S3에 저장하는 API를 만들고자 한다. 먼저 boto3 라이브러리가 필요하다. 1. boto3 AWS에서 제공하는 Python용 AWS SDK Boto3를 사용하면 Python 애
donghyeok90.tistory.com
1. DB에 저장할 테이블을 만든다.

2. 개발한 포스팅 API 코드
from flask import request
from flask_restful import Resource
from datetime import datetime
import boto3
from mysql.connector import Error
from config import Config
from mysql_connection import get_connection
class PostingResource(Resource):
def post(self):
# 1. 클라이언트로부터 데이터를 받아온다.
# form-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']
print(file.content_type)
# 업로드한 파일이 이미지가 아닌 경우 처리
if 'image' not in file.content_type:
return {'error' : '이미지파일만 업로드하세요.'}
# 2. 사진을 먼저 S3에 저장한다.
# 파일명을 유니크하게 만드는 방법
current_time = datetime.now()
new_file_name = current_time.isoformat().replace(':', '_') + '.' + file.content_type.split('/')[1]
print(new_file_name)
# 파일명을, 유니크한 이름으로 변경한다.
# 클라이언트에서 보낸 파일명을 대체
file.filename = new_file_name
# 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. 저장된 사진의 이미지URL을 만든다.
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'}
config.py 파일
- 민감한 정보를 관리
class Config :
HOST = AWS RDS주소
DATABASE = DB명
DB_USER = 유저명
DB_PASSWORD = 비밀번호
# AWS 관련 키
ACCESS_KEY = IAM 사용자 access key
SECRET_ACCESS = IAM 사용자 secret access key
# S3 버킷
S3_BUCKET = 버킷명
# S3 Location
S3_LOCATION = 'https://버킷명.지역명.amazonaws.com/'
위에 사용한 get_connection 함수는 다음과 같다.
def get_connection():
connection = mysql.connector.connect(
host= Config.HOST, # AWS RDS 주소
database= Config.DATABASE, # DB명
user= Config.DB_USER, # 유저명
password= Config.DB_PASSWORD # 비밀번호
)
return connection
3. 테스트
포스트맨에서 테스트

성공했다고 나온다.
DB에 가서 확인해보자.
select * from posting;

DB에 성공적으로 저장되었고 이미지 주소도 정상적인걸 확인.

'REST API' 카테고리의 다른 글
Python HTTP 라이브러리 - Requests 사용법 (0) | 2023.01.13 |
---|---|
네이버 오픈API 활용 - 뉴스 검색 API (0) | 2023.01.13 |
API서버 - AWS Rekognition을 사용한 Object Detection API (0) | 2023.01.13 |
API서버 - @jwt_required(optional=True)를 이용한 분기 처리 (0) | 2023.01.10 |
API서버 - Flask 쿼리스트링(Query String)을 사용한 API (0) | 2023.01.06 |