読者です 読者をやめる 読者になる 読者になる

Apache Tika があばずれに育ってて泣いた

Java

我がプロジェクトでは Apache Tika というライブラリを利用している。

このチカちゃんは、ファイルの中身や名前を元に MimeType を判定してくれたり、ファイル内からテキスト部分だけを抽出してくれたりとなかなか優れたライブラリ、だった。


今まで使用していた Tika のバージョンは 1.1。現在の最新版は 1.4 なのでよっこらセックスと一声上げてバージョンアップを試みたところ、今まで出来ていたファイルの判定ができなくなっていた。いずれも、ファイル名の情報は無しで、純粋にコンテンツから MimeType を判断してもらった場合である。

具体的には、MimeType 判定部分で、下記二点の問題が発生した。
1) UTF-8 以外のテキストファイルの MimeType が "application/octet-stream" になる
2) encoding が UTF-8 以外の XML ファイルの MimeType が "text/plain" になる

ではそれぞれ見ていこう。

UTF-8 以外のテキストファイルが "application/octet-stream" と判定される

今までは Shift-JIS や EUC-JP で書いたテキストファイルもチカちゃんに食べさせれば text/plain だと判定してくれた。けなげな娘である。
それがすっかりあばずれに育ってしまい、「あたしゃ UTF-8 以外は食えねえんだっつってんだろ!」と強気で豪気な娘になってしまった。
結果チカちゃんは UTF-8 以外のテキストファイルについては text/plain ではなく application/octet-stream として判断してしまう。

閉じた世界(ユーザーからの入力が少ない、または限定的)ならばこの仕様でも良い。その閉じた世界の中を全て UTF-8 にしてしまえば良いからだ。残念ながら今回の用途は Web 用途なので、ユーザーの入力がありまくるのである。単なる Shift-JIS のテキストファイルを返すのに、Content-Type が application/octet-stream だなんてブラウザに申し訳が立たない。

UTF-8 以外の XML ファイルが "text/plain" と判定される

上と似たような問題ではあるが、微妙に異なる。

UTF-8 以外の XML ファイルが何故か text/plain と判定されてしまう。
単に UTF-8 以外読めないなら application/octet-stream になりそうなものだが、そうでは無いらしい。

調べてみると、文字コード判定の部分で、今までは icu4j を使っていたのが juniversalchardet というものに変わったようだ。
このライブラリの入れ替え時に色々変更が入ったのだろう。

追記

UTF-8 以外が読めないのではなく、XML ドキュメント宣言の encoding 属性の値がより厳密になったようだ。
テストでは <?xml version="1.0" encoding="shift-jis"?> という宣言の XML を読ませて text/plain と判断されていたが、<?xml version="1.0" encoding="Shift_JIS"?> としたところ正常に application/xml と判断された。

まとめ

Apache Tika ちゃんがあばずれに育ってた。
いや逆に UTF-8 に一途すぎるのだろうか。