Ruby でファイルタイプの判別をして、HTTPヘッダにContent-Typeを書き出したい時。
使い方は以下のエントリに詳しいので割愛
MIME::Typesは、IANAに登録されているMIME型情報を元に、ファイルの拡張子から判別を行なうので、拡張子が付いていないものに対しては無力です。(ry) pure ruby であり、また gem を使って簡単にインストールすることが出来ます。(ry)
gem install mime-typesRubyにおけるMIME型判別ライブラリの比較 - ¬¬日常日記MIME::Typesライブラリ
クラスMIME::Typesのクラスメソッド type_for を使って判別を行ないますが、返り値がMIME::Typeオブジェクトのリストであることに注意しましょう。
require 'mime/types' path = '/home/keita/test.png' MIME::Types.type_for(path)[0].to_s # => "image/png"
追加で知っておくべきこと。
実際使ってみてわかったことや注意することなど
シンボリック・リンクについては判別が出来ない
シンボリックリンクについては動かなかった(at OSX mountain lion)
なので事前にファイルパスを展開しておく必要があった。
path = File.expand_path( md5_hash_key, link_dir) path = File.readlink(link_name) if File.ftype(link_name) == “link”
候補(拡張子とMIME対応表)は追加することが出来る
既存の候補がある場合でも、じぶんで候補を追加できる。追加すると配列末尾に追加される
追加例
#追加 a=MIME::Type.new("text/plain") {|t| t.extensions << "rb"} MIME::Types.add a #配列の先頭は?初期値のママ ret = MIME::Types.type_for("test.rb”).first.to_s #=> application/x-ruby #末尾に追加したTYPEがある ret = MIME::Types.type_for("test.rb").last.to_s #=> text/plain
と既存項目を上書きは面倒だが、末尾に追加は簡単にできる。