それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ruby で content-type判別する

Ruby でファイルタイプの判別をして、HTTPヘッダにContent-Typeを書き出したい時。

mime/types を使う

使い方

require 'mime/types’


これを使う。

使い方は以下のエントリに詳しいので割愛

MIME::Typesは、IANAに登録されているMIME型情報を元に、ファイルの拡張子から判別を行なうので、拡張子が付いていないものに対しては無力です。(ry) pure ruby であり、また gem を使って簡単にインストールすることが出来ます。(ry)

gem install mime-types

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"
RubyにおけるMIME型判別ライブラリの比較 - ¬¬日常日記

追加で知っておくべきこと。


実際使ってみてわかったことや注意することなど

シンボリック・リンクについては判別が出来ない

シンボリックリンクについては動かなかった(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::Typesは拡張子で判別する。戻り値はMIME::Typesの配列。なぜか?。拡張子に対応するMIMEタイプが複数あるからだ

複数候補があるので配列が出てくる

     type_for は配列を返す。なぜなら、候補が複数あるからだ。

候補(拡張子と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


と既存項目を上書きは面倒だが、末尾に追加は簡単にできる。