-
[flask] python - UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start bytePrograming/python 2021. 11. 22. 10:42
flask로 백엔드 서버를 구축중이다.
문제 발생의 주요 부분은,
프론트로부터 전달받은 이미지(bytes) 파일을 celery worker에게 전달해주는 과정에서
bytes 전송시 string으로 형변환 해서 넘겨줘야한다.
(message broker는 'redis' 사용)
그런데, decode('utf-8') 함수를 사용해 bytes to string 형변환을 하니 아래와 같은 에러가 뜬다.
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
파이썬은 기본적으로 'utf-8' 문자 포맷을 사용하는데
전달받은 이미지 파일의 포맷이 달라서 생기는 문제였다. (utf-16이라는 말이 있음)
실제로 출력을 해보니 맨 앞이 0xff로 시작하는걸 확인 할 수 있었다.
flask rest api의 기본 구조를 보면 아래와 같다.
... @app.route('/test', methods=['POST']) def test(): if request.method == 'POST': file = request.files['file'] img_bytes = file.read() # <-- img_str = img_bytes.decode("utf-8") # error ...
file.read() 부분을 아래와 같이 수정하면 된다.
... import base64 # <-- @app.route('/test', methods=['POST']) def test(): if request.method == 'POST': file = request.files['file'] image_byte = base64.b64encode(file.read()) # <-- img_str = image_byte.decode('utf-8') # <-- ...
출력해보면 문자열 값이 잘 출력된다.
그럼 다시 bytes로 변환 후 확인해보자.
... img_new_bytes = img_str.encode(encoding="utf-8") img_new_bytes = base64.b64decode(img_new_bytes) image = Image.open(io.BytesIO(img_new_bytes)) image.show()
정상적으로 이미지가 출력되는 걸 확인 할 수 있다.
[완성 소스코드]
... import base64 @app.route('/test', methods=['POST']) def test(): if request.method == 'POST': file = request.files['file'] # 이미지 파일 # bytes to string image_byte = base64.b64encode(file.read()) img_str = image_byte.decode('utf-8') # send to celery worker # string to bytes img_new_bytes = img_str.encode(encoding="utf-8") img_new_bytes = base64.b64decode(img_new_bytes) # 이미지 출력 image = Image.open(io.BytesIO(img_new_bytes)) image.show() ...
'Programing > python' 카테고리의 다른 글
[python] 파이썬에서 requests로 파일 전송하기. (0) 2020.11.03 [python] 웹 사이트 크롤링(parsing) with BeautifulSoup/requests/selenium (0) 2020.03.16 [data statistics] Data distribution (0) 2019.11.26 [python] Make Korail reservation Macro with telegram bot (2) 2019.11.12 [python] python3 - urllib3 telepot ssl certificate verify error (0) 2019.11.11