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

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

 

 

 

원인

Metadata metadata = ImageMetadataReader.readMetadata(f1);

 

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

 

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

 

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

 

 

 

이미지 분석 및 해결

 

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

 

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값을 봤다.

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

 

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

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

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

 

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

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

 

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

 

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

 

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

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

 

 

 

📜참고