ImageMetadataReader.readMetadata에서 com.drew.imaging.ImageProcessingException: File format is not supported 에러 발생 시 해결 방법

JPEG 이미지임에도 불구하고 파일 업로드가 되지 않아 파일 시그니처를 체크하게 되었다.
결과적으로, 문제의 파일이 실제로는 PNG 파일이었고, 확장자를 수정하여 업로드하니 정상적으로 작동하는 것을 확인했다.
이미지 파일 업로드 중 에러 발생 시, 파일 시그니처를 체크하라는 교훈을 얻었다.

 

 

 

원인

Metadata metadata = ImageMetadataReader.readMetadata(f1);

 

이미지 파일이 업로드가 되지 않는다는 이슈를 전달받고 디버깅을 진행하던 중, 위의 코드에서 File format is not supported라는 에러가 발생하는 것을 파악했다.

 

jpg 확장자인 다른 파일들은 업로드되는데 이 파일이 타입 에러로 업로드되지 않는다는 게 이상해 파일 타입을 검사하는 코드를 추가했다.

 

하지만 아무리 디버깅을 진행해도 진전이 나질 않아 문제의 이미지 파일을 뜯어보기로 했다.

 

 

 

이미지 분석 및 해결

etc-image-0

 

정상적으로 업로드되는 파일들은 에러가 발생하지 않았는데, 문제의 파일에서는 역시나 에러가 발생했다.

 

NOTE: File did not start with JPEG marker. Consider using [Tools->Img Search Fwd] to locate embedded JPEG.

참고: 파일이 JPEG 마커로 시작하지 않았습니다. 내장된 JPEG를 찾기 위해 [Tools->Img Search Fwd]를 사용하는 것을 고려해 보십시오.

 

파일이 JPEG 마커로 시작하지 않았다고 한다.

해당 문구를 보고 시그니처를 체크해야겠다고 생각이 들었다.

 

먼저 정상적인 jpg 파일부터 Hex값을 봤다.

etc-image-1
정상적으로 업로드 되는 'jpg 파일' 시그니처

 

정상적인 jpg 파일은 시그니처가 FF D8로 시작하는 것을 볼 수 있다.

다음으로 비정상적인 jpg 파일을 보자.

blob
업로드 시 에러가 발생했던 '문제의 파일' 시그니처

 

역시나 시그니처가 89 50으로 시작한다.

FF D8은 jpg의 시그니처가 맞지만, 89 50은 png의 시그니처다.

 

그럼 업로드 시 에러가 발생했던 파일의 확장자를 png로 수정 후 업로드해 보자.

etc-image-3

 

지금까지 디버깅했던 시간이 무색하게 아주 잘 올라간다.

 

만약 똑같이 ImageMetadataReader.readMetadata의 과정에서 File format is not supported 에러가 발생한다면 시그니처를 체크하도록 하자.

파일이 위변조 되었을 수 있다.

 

 

 

📜참고