Apache Tika로 MIME Type 알아내기
MIME Type이란?
MIME으로 인코딩한 파일은 Content-Type 정보를 가지고 있다.
MIME Type은 “파일종류/파일포맷” 형태를 가지고 파일 형식에 따라 구동 할 프로그램을 구분지을 수 있도록 해준다.
Apache Tika
Apache Tika는 다양한 문서에서 메타정보와 컨텐츠를 추출 하기 위해 사용할 수 있는 라이브러리 이다.
Apache Tika Download
Apache Tika는 https://tika.apache.org/download.html 에서 다운로드 받을 수 있다.
Maven에서 추가 하기
maven을 이용한다면 아래의 내용을 pom.xml에 추가하면 된다.
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>...</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>...</version>
</dependency>
Ant에서 추가하기
ant를 사용하는 프로젝트인 경우 jar 파일을 다운로드 받아서 아래와 같이 추가 해준다.
<classpath>
... <!-- your other classpath entries -->
<!-- either: -->
<pathelement location="path/to/tika-core-${tika.version}.jar"/>
<!-- or: -->
<pathelement location="path/to/tika-app-${tika.version}.jar"/>
</classpath>
자세한 내용은 Apache Tika의 Getting Started 문서를 참고한다.
https://tika.apache.org/1.8/gettingstarted.html
Tika Java 코드
Tika 객체를 생성하여서 detect 메소드를 활용하면 File의 MIME Type을 String 문자열로 리턴 받을 수 있다.
다른 라이브러리를 이용하면 확장자를 통해 MIME Type을 판별하거나 정확한 MIME Type을 얻기가 어려운데…
Tika는 파일의 확장자를 변조하거나 하여도 정확한 MIME Type을 알려준다.
private static boolean isValidMimeType(File[] files) {
// image file, pdf, excel, text, zip 파일에 해당하는 mime type이 아니면 업로드 불가
Tika tika = new Tika();
String mimeType;
try {
for (File file : files) {
mimeType = tika.detect(file);
if (!isPermittedMimeType(mimeType)) {
return false;
}
}
} catch (Exception e) {
return false;
}
return true;
}
private static boolean isPermittedMimeType(String mimeType) {
String[] validMimeTypes = {"image", "application/pdf", ...(생략) };
for (String validMimeType : validMimeTypes) {
if (StringUtils.startsWith(mimeType, validMimeType)) {
return true;
}
}
return false;
}
Tika에서 정의한 Mime Type의 목록을 확인 하려면 tika-mimetypes.xml 내용을 확인 하면 된다.
Tika MIME Type
tika-mimetypes.xml
MIME Type 포맷 규칙
Mime Type의 포맷은 일정한 규칙이 있다.
- “파일종류/파일포맷” 형식으로 이름이 지어진다.
- x- 로 시작하는 (prefix) MIME Type은 non-standard한 MIME 이다.
- vnd 로 시작하는 MIME Type은 Vendor specific 한 Type 으로 벤더사에서 제공하는 MIME Type 이다.
예를 들어 마이크로 소프트사의 msword는 MIME Type이 “application/vnd.ms-word” 이다.