'MimeType'에 해당하는 글 2건

파일 mime-type 체크

Daily/Prog 2020. 5. 14. 18:26



얼마전 s3 에 업로드된 상당량의 이미지 mime-type 이 octet-stream 으로 올라가 있는 것을 확인했다. 또 그 파일들은 모두 확장자가 대문자인 것도 확인했다.


String mimeType = Files.probeContentType(path);


위 부분에서 대문자 확장자 파일들에 대한 처리가 정상적으로 되지 않아 null 을 반환한 것이 문제였다. 확장자로 mimeType 을 얻어오는 과정에서 발생할 예외들을 미리 예상하여 처리할 수도 있지만, 업로드시 파일에서 직접 mimeType 을 확인할 수도 있다. Apache 의  Tika 라이브러리를 사용해 봤다.


compile group: 'org.apache.tika', name: 'tika-core', version: '1.24'

...

String mimeType = new Tika().detect(inputStream);


tika-parsers 는 용량이 어마무시하다. parser 가 꼭 필요한게 아니라면 core 만 받자.


그리고 기존에 s3 에 octet-stream 타입으로 업로드된 이미지 파일들은 aws-cli 로 배치처리 하여 image/jpeg 으로 변경하였다.


> aws s3 cp \

 s3://bucket/path \

 s3://bucket/path \

 --exclude "*" \

 --include "*.JPG" \

 --acl public-read \

 --no-guess-mime-type \

 --content-type "image/jpeg" \

 --metadata-directive "REPLACE" \

 --recursive

 --profile myprofile


아쉽게도 include 에 지정한 패턴이 대소문자를 구분하지 못해서 시간이 꽤 걸렸음...




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,



첨부파일의 타입을 체크해야 할 때 해당 파일의 MimeType 을 살펴보면 어떤 파일인지 알 수 있는데, png 이미지 파일의 MimeType 이 image/png 이 아닌 application/octet-stream 로 넘어오는 현상을 발견했다.


new MimetypesFileTypeMap().getContentType(filename);


위와 비슷하게 MimetypesFileTypeMap() 을 사용했는데 이 메소드는 주어진 파일의 확장자를 이용하여 MimeType 을 확인하기 위해 사용자 시스템에서 다음의 순서로 mime.types 파일을 찾는다.


  1. 프로그래밍 방식으로 MimetypesFileTypeMap 인스턴스에 항목 추가
  2. 사용자의 홈 디렉토리에 있는 .mime.types
  3. <java.home>/lib/mime.types
  4. META-INF/mime.types
  5. META-INF/mimetypes.default (일반적으로 activation.jar 파일에만 있다.)


이 과정에서 mime.types 파일을 찾지 못하면 MimeType 으로 application/octet-stream 를 반환한다. 이 메소드는 주어진 파일의 확장자만 이용하여 파일의 타입을 판단하기 때문에 처리 시간이 아주 짧지만 사용자 시스템의 환경에 따라 정확도는 떨어진다. 웹 서버에는 흔히 META-INF/mime.types 파일이 있지만 사용자 환경에서 개발시에는 결과값이 다를 수 있다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,