LoginSignup
4
1

More than 3 years have passed since last update.

【Java】Apathce Tikaでファイルの内容からMimeTypeを取得する【Kotlin】

Last updated at Posted at 2019-06-06

やりたいこと

ファイル内容から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を使いましたが、URLConnectionmime-utilを使う方法の方が検索で出てくるという意味ではメジャーです。
しかし、これらは検出精度やメンテナンスの継続に難が有ったため、今回は試しにTikaを用いました。

記事を書くにあたって利用させていただいたサイト

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1