やりたいこと
ファイル内容からMimeTypeを取得します。
MimeTypeはファイルの拡張子からも推測できますが、書き換えられていたりすると困る用途に用いるため、ファイル内容から取得します。
手段
Apache Tikaを使います。
ただし、TikaInputStream
を絡めたやり方でなければ結果がファイル名に左右されます。
導入方法
MavenからApache Tika Coreを導入して使います。
検証には1.21
を使いました。
検証用コード
雑ですが、src/main/resources
配下のファイルすべてについてMimeTypeを取得するサンプルです。
補足として、org.apache.tika.metadata.Metadata
型はKotlinのMetadata
型と名前が被るため、型に名前を付けています。
resources内のファイルを読み込み、MimeTypeを出力する
import java.io.File
import org.apache.tika.Tika
import org.apache.tika.io.TikaInputStream
import org.apache.tika.metadata.Metadata as TikaMetadata
fun main() {
val resourcesDir = File(System.getProperty("user.dir") + "/src/main/resources")
val metaData = TikaMetadata()
val tika = Tika()
resourcesDir.listFiles().map {
val tikaStream = TikaInputStream.get(it.toURI(), metaData)
// 拡張子はソートのためlowerCaseに統一
it.name.split(".").last().toLowerCase() + " -> " + tika.detect(tikaStream, metaData)
}.sorted().forEach {
// ソートした上で出力
println(it)
}
}
実行結果
その辺にあったファイルやサンプルを放り込んで回してみた結果です。
大体一意に取れてます。また、拡張子を書き換えて試してみても大体上手く動作しました。
7z -> application/x-7z-compressed
avi -> video/x-msvideo
docx -> application/vnd.openxmlformats-officedocument.wordprocessingml.document
exe -> application/x-dosexec
flv -> video/x-flv
html -> text/html
jpg -> image/jpeg
jpg -> image/jpeg
m3u -> text/plain
mkv -> video/x-matroska
mkv -> video/x-matroska
mkv -> video/x-matroska
mkv -> video/x-matroska
mov -> video/quicktime
mov -> video/quicktime
mov -> video/quicktime
mov -> video/quicktime
mp3 -> audio/mpeg
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/x-m4v
mpg -> video/mpeg
mpg -> video/mpeg
mpg -> video/mpeg
msi -> application/x-ms-installer
pdf -> application/pdf
png -> image/png
pptx -> application/vnd.openxmlformats-officedocument.presentationml.presentation
svg -> image/svg+xml
ts -> application/octet-stream
vcmf -> application/octet-stream
vob -> video/mpeg
webm -> video/webm
webm -> video/webm
webm -> video/webm
webm -> video/webm
zip -> application/zip
他の手段
今回はTikaを使いましたが、URLConnection
やmime-util
を使う方法の方が検索で出てくるという意味ではメジャーです。
しかし、これらは検出精度やメンテナンスの継続に難が有ったため、今回は試しにTikaを用いました。