📝이미지를 S3에 업로드하는 API 만들기
우선 포스트맨에서 경로를 설정해주고 ex) http://localhost:5000/upload
Body에 form-data로 키값을 입력하고 텍스트가 아닌 파일로 지정해서 밸류값에 이미지를 업로드 해줬다
Visual Studio Code를 실행해 코드를 작성해준다
from flask import request
from flask_restful import Resource
from mysql.connector import Error
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']
# 클라이언트가 보낸 파일의 파일명을 변경시켜서 S3에 올려야 유니크하게 파일을 관리할 수 있다
# 파일명을 현재시간으로 유니크하게 만드는 방법
current_time = datetime.now()
# 콜론은 파일명에 들어갈 수 없음으로 바꿔준다
new_file_name = current_time.isoformat().replace(':', '_') + '.jpg'
# 파일명을 유니크한 이름으로 변경한다(클라이언트에서 보낸 파일명을 대체)
file.filename = new_file_name
# boto3를 이용해서 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로 실행해준다
try :
# 저장할 파일과 버킷명, 파일이름, ExtraArgs를 설정
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
# 성공했을때 imgUrl값도 같이 넘겨준다
return {"result" : "success", "imgUrl" : Config.S3_LOCATION + new_file_name}
포스트맨에 셋팅한데로 실행해보면 S3에 잘 업로드 되었고 이미지 Url도 잘 나온다
'Restful API' 카테고리의 다른 글
[Restful API] 이미지와 텍스트 포스팅하는 API만들기 (1) | 2023.01.13 |
---|---|
[Restful API] S3에 저장한 이미지를 객체 탐지하는 API만들기(Rekognition) (0) | 2023.01.12 |
[Restful API] Query String 검색하는 API 만들기 (0) | 2023.01.10 |
[Restful API] 회원, 비회원 둘 다 동작하는 API 만들기 (1) | 2023.01.10 |
[Restful API] 실시간으로 추천하는 API 만들기 (0) | 2023.01.10 |
댓글