Magnolia Tech

いつもコードのことばかり考えている人のために。

Javaでファイルの内容からMIME Typeを推測する方法

前回のエントリの続きです。

blog.magnolia.tech

前回はファイル名から…つまり拡張子をもとにMIME Typeを特定する方法を紹介しましたが、今回はファイルの内容からMIME Typeを推測する方法です。

Files.probeContentType

前回も紹介した下記のブログエントリに、カスタマイズ方法が記載されていますが、Files.probeContentTypeMIME Typeを決定するアルゴリズムはカスタマイズ可能で、java.nio.file.spi.FileTypeDetectorを継承したクラスを作成し、サービスとして登録します。

waman.hatenablog.com

デフォルトのアルゴリズムでは、ファイル名を元にMIME Typeを決定しているので、独自にロジックを書けばファイルの内容からMIME Typeを推測することが可能になります…が、ちょっと使うにはかなりハードルが高いですし、汎用的に作ろうとすると異常な努力が必要になってくるので、アプリケーションの仕様から特定のフォーマットを識別したい、という時以外は採用は厳しそうです。

URLConnection.guessContentTypeFromStream

URLConnection.guessContentTypeFromNameはファイル名(拡張子)からMIME Typeを特定していましたが、java.io.InputStreamからの入力(つまりデータの中身そのもの)からMIME Typeを推測するメソッドがURLConnection.guessContentTypeFromStreamです。

いきなりopenJDKのソースへのリンクを張っておきますが、実装を見ると主にtext/htmlapplication/xmlimage/gifimage/pngimage/jpegあたりの判定には使えそうです(それ以外は…なぜそれを判定対象にした?という感じの並びですね…)。

github.com

判定ロジックがべた書きされているので、カスタマイズ方法は無さそうです。サブクラスを作れば別ですが、そうすると完全にロジックを書かないといけないので、これまた異常な努力が必要になりますね。

おわりに

ファイルの内容から推測する方法は、あまり汎用的な方法は(当然ですが)無いので、URLConnection.guessContentTypeFromStreamを使う以上の汎用性は求めない方が良さそうです。

スッキリわかるJava入門 第2版 (スッキリシリーズ)

スッキリわかるJava入門 第2版 (スッキリシリーズ)