@ledsun blog

無味の味は佳境に入らざればすなわち知れず

JavaでMimeUtilライブラリを使ってファイルの中身からデータ形式を判定する

ファイルのデータ形式MIMEタイプ)を拡張子からではなく、ファイルの中身で判別したいことがある。 JavaではMimeUtilというライブラリが使える。

準備

JDKはインストール済みで、binディレクトリにパスが通っている前提。

本体

http://sourceforge.net/projects/mime-util/files/mime-util/mime-util-2.1.3/ からダウンロード

  • mime-util-2.1.3.jar

依存ライブラリ

SLF4J

http://www.slf4j.org/download.html からダウンロードして解凍

  • slf4j-api-1.5.6.jar
  • slf4j-log4j12-1.5.6.jar

log4j

http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.17/log4j-1.2.17.zip からダウンロードして解凍

必要なjarをC:\tempに移動

動かしてみる

jarをクラスパスに指定して、jrunscriptを起動

c:\temp>jrunscript -cp mime-util-2.1.3.jar;slf4j-api-1.7.2.jar;slf4j-log4j12-1.7.2.jar;log4j-1.2.17.jar

起動したら、MimeUtilの判定方法を「ファイルの中身」に設定する

importClass(Packages.eu.medsea.mimeutil.MimeUtil);
MimeUtil.registerMimeDetector('eu.medsea.mimeutil.detector.MagicMimeMimeDetector');

次のようにLog4Jの警告が表示されるが気にしない

js> log4j:WARN No appenders could be found for logger (eu.medsea.mimeutil.TextMimeDetector).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
eu.medsea.mimeutil.detector.MagicMimeMimeDetector@108786b

続いて判定を実行

MimeUtil.getMimeTypes(new java.net.URL('http://upload.wikimedia.org/wikipedia/commons/a/ad/Wikipedia-logo-v2-ja.png'));

結果

image/png

これだけでは拡張子を見てるのかファイルの中身を見ているのかわからないので、好きなファイルに変更して動きを確かめてみるとよい。 javadoc を見るとFileオブジェクト、URLオブジェクト、ファイル名、バイト配列、InputStreamと大体なんでも対応している。

存在しないファイルを指定したり、文字数が短かったりで判定できない場合は「application/octet-stream」を返すので注意が必要。

しかしLog4jに依存するのはやめてほしい・・・。

参考にしたサイト