ScalatraのMIME Type関係の機能が盛大に壊れている訳ですが、じゃあそれを直すためにMIME Typeを教えてくれるライブラリについて調べてみました。標準ライブラリだけでもいくつか方法が有りますね。
Files.probeContentType
Java7から導入されたFiles.probeContentType
を使うと、簡単にMIME Typeを取得できます。
scala> import java.nio.file.Files import java.nio.file.Files scala> import java.nio.file.Paths import java.nio.file.Paths scala> val htmlfile = Paths.get("test.html") htmlfile: java.nio.file.Path = test.html scala> Files.probeContentType(htmlfile) res2: String = text/html scala> val cssfile = Paths.get("test.css") cssfile: java.nio.file.Path = test.css scala> Files.probeContentType(cssfile) res3: String = text/css scala> val jsfile = Paths.get("test.js") jsfile: java.nio.file.Path = test.js scala> Files.probeContentType(jsfile) res4: String = text/javascript
最後、javascriptがtext/javascript
になっていますが、application/javascript
で返して欲しいですね。カスタマイズは可能です。下記のブログエントリが参考になります。
返って来る値が実装依存なので、自分が使いたいMIME Typeはきちっとテストを書いておきましょう。
URLConnection.guessContentTypeFromName
URLConnection.guessContentTypeFromName
もファイル名からMIME Typeを取得できます。
scala> import java.net.URLConnection import java.net.URLConnection scala> URLConnection.guessContentTypeFromName("test.html") res5: String = text/html scala> URLConnection.guessContentTypeFromName("test.css") res6: String = null scala> URLConnection.guessContentTypeFromName("test.js") res7: String = null
デフォルトでは、かなり残念な結果になりました。こちらもMIME Typeはカスタマイズ可能です。こちらの記事によると、content-types.properties
というファイルを用意すれば良さそうです。
Getting and Extending mime-types in Javathilosdevblog.wordpress.com
content-types.properties
の正式なフォーマットの解説が見つけられませんでしたが、こちらのブログにサンプルファイルが紹介されていました。
javax.activation.MimetypesFileTypeMap
最後はjavax.activation.MimetypesFileTypeMap
です。
scala> import javax.activation.MimetypesFileTypeMap import javax.activation.MimetypesFileTypeMap scala> val mimeTypesMap = new MimetypesFileTypeMap mimeTypesMap: javax.activation.MimetypesFileTypeMap = javax.activation.MimetypesFileTypeMap@7e258a05 scala> mimeTypesMap.getContentType("test.html") res8: String = text/html scala> mimeTypesMap.getContentType("test.css") res9: String = application/octet-stream scala> mimeTypesMap.getContentType("test.js") res10: String = application/octet-stream
こちらもcssとjavascriptが正しく扱えていません。カスタマイズ方法は公式ドキュメントにきちんと書かれています。
MimetypesFileTypeMap (Java Platform SE 8)
しかし、残念ながらこのパッケージは将来廃止が予定されています。
JEP 320: Remove the Java EE and CORBA Modules
これから新しく使うには相応しくないですね。
おわりに
ファイル名からMIME Typeを取得する方法を紹介しました。標準ライブラリだけでも3種類有って、更にそれぞれカスタマイズ方法が違うってなかなかカオスな感じですね。
ScalatraのMimeTypesは、ファイルの内容に基づいてMIME Typeを推測する機能も有るので、次回はその方法について紹介します。