image를 스토리지에 저장하고 url을 db에 저장하는게 제일 효율적이지만 이번 프로젝트에서는 base64인코딩을 해서 db에 저장하기로 했다. 그러던 중 사진을 리사이징하고 싶다는 욕심이 생겼고 처음에는 bytesIO 버퍼에 대한 개념없이 코드를 긁어와서 썼더니 오류가 났다.
file = request.files['img']
extension = file.filename.split('.')[-1]
format = 'JPEG' if extension.lower() == 'jpg' else extension.upper()
img = Image.open(file)
wpercent = (614/ float(img.size[0]))
h_size = int((float(img.size[1]) * float(wpercent)))
img_resize = img.resize((614, h_size))
buffered = BytesIO()
img_resize.save(buffered, format)
image_base64 = base64.b64encode(img_resize.read())
오류메시지는 read를 불러올 수 없다는 거였고 나는 방법을 바꿔서 로컬에 저장해버리자고 생각했다. 그런데 이건 아무래도 아니다 싶어 bytesIO에 대해 공부해보니 byte형태로 메모리를 열어서 잠시 저장하는 거라고 이해했고 이 코드를 보니 buffer에 저장을 해놓고 아예 쓰지 않은 거였다. 역시 긁어온 코드를 내 코드로 만드려면 이해가 필수적으로 동반되어야 한다. 공부 이후에 바뀐 코드는 다음과 같다.
from PIL import Image
from io import BytesIO
file = request.files['img']
extension = file.filename.split('.')[-1]
format = 'JPEG' if extension.lower() == 'jpg' else extension.upper()
img = Image.open(file)
wpercent = (614/ float(img.size[0]))
h_size = int((float(img.size[1]) * float(wpercent)))
img_resize = img.resize((614, h_size))
buffered = BytesIO()
img_resize.save(buffered, format)
image_base64 = base64.b64encode(buffered.getvalue())
resize까지 시도를 하셨군요! 엄청나네요!