군침이 싹 도는 코딩
S3에 이미지 업로드하는 API 본문
# 이미지를 담을 버킷을 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 버킷에서도 잘 확인 할 수 있다
'Python > Flask' 카테고리의 다른 글
사진과 글을 DB에 저장하는 API (0) | 2023.01.13 |
---|---|
S3에 저장된 이미지 객체 탐지 API (1) | 2023.01.12 |
리얼 타임 추천 시스템 API (0) | 2023.01.10 |
추천 시스템 API (0) | 2023.01.10 |
API JWT 토큰 로그인 유무에 따라 다르게 처리하는법 (0) | 2023.01.10 |