[Mac]jMimeMagic MIME-type

코드로 배우는 스프링 웹프로젝트의 예제를 진행하면서 썸네일 이미지 처리 부분에 null pointer exception이 발생하였습니다.

실습 코드는 다음과 같이 인자로 file을 사용하여 image 파일인지 여부를 검사하여 리턴하는 boolean타입의 메소드를 작성하였습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
private boolean checkImgType(File file) {
	try {
		String contentType = Files.probeContentType(file.toPath());
		
		return contentType.startsWith("image");
	} catch (Exception e) {
		e.printStachTrace();
	}
	return false;
}

Files.probeContentType(file.toPath()); 이 부분에 null을 반환하는 것에 대한 오류를 검색하였고 해당 문제는 스택오버플로우 에서 확인할 수 있었습니다.

문제에 대해 간단히 요약하자면 FileTypeDetector를 사용하여 MIME형식을 검사하는 probeContentType의 기본 구현은 OS에 따라 조금씩 차이를 보이며 때때로 실패할 수도 있으며 파일에 확장명이 없으면 오류가 발생할 수도 있다는 점을 확인 할 수 있었습니다. Window환경에서는 제대로 작동을 하는 코드지만 제가 사용하는 Mac OS 환경에서 java 8 버전은 Null을 반환하는 것을 알았고 해결 방법은 다음과 같습니다.

해결방법

Files.probeContentType(file.toPath()); 부분을 대신해 jmimemagic 을 사용하여 mime-type을 체크하는 작업을 대체할 수 있는 것을 확인 후 적용해봤습니다.

1. xml. 작성

이미지를 업로드한 후 썸네일 작업 처리는 Thumbnailator를 사용하였습니다. 기존에 추가한 Thumbnailator 밑에 jmimemagic Maven 종속성을 pom.xml 에 추가합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<dependency>
  <groupId>net.coobird</groupId>
  <artifactId>thumbnailator</artifactId>
  <version>0.4.8</version>
</dependency>
<dependency>
  <groupId>net.sf.jmimemagic</groupId>
  <artifactId>jmimemagic</artifactId>
  <version>0.1.5</version>
</dependency>

2. checkImgType( ) 수정

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
private boolean checkImgType(File file) {
				
		try {
			
			Magic magic = new Magic();
			MagicMatch match = magic.getMagicMatch(file,false);
			return match.getMimeType().contains("image");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return false;
	}

jMimeMagic 은 MIME 유형을 가져오는데 사용하는 라이브러리중 하나입니다.

getMagicMatch메소드에 확인할 file과 false를 파라미터를 넘겨주면 file이 null인지 체크 후 파일이 존재하면 matcher.getMatch().getMimeType() 를 리턴하게 됩니다.

이를 통해 match클래스의 변수를 이용해 getMimeType() 함수를 사용해 contains("image") 로 검사 후 mime-type이 image라면 true를 반환하게 됩니다.

결과

스크린샷 2019-05-25 오전 12 58 22


Reference