ファイルのデータ形式(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 からダウンロードして解凍
- log4j-1.2.14.jar
必要な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に依存するのはやめてほしい・・・。