Kohanaの基本動作覚書
mimeタイプの判定について
画像に限らず、mimeタイプの取得は悩ましいところで、最初はヘルパーとして付いていたfile::mime()メソッドを利用して$mime = $file::mime(ファイルのフルパス);としたのだけけれど、非画像系ファイルのタイプ情報を正しく獲得できなかった。
system/helpers/file.phpを見たところ、下記のような判定順序が書かれていた。
mimeタイプの判定優先順
jpg,pngなどの画像ファイル:getimagesize関数で得る。
それ以外のもの。
(1)phpのfinfo_open関数が有効な時にはFILEINFO_MIME
(2)php.iniでmime_magic.magicfileが有効
かつ、mime_content_typeがある時にはそれに従う
(3)OSがMS-WINDOWS以外のものならば、
fileコマンドを探し、システムのmime定義に従う
(4)kohanaのconfig/mimes.phpでのタイプ情報を利用
MacPortに任せっきりで*.iniなどの設定変更を見向きもしていないぼくの環境では、(1)(2)(3)が正しく設定されておらず、結果(3)が動作して誤判定されていた。もちろんKohanaは悪くはない。Kohanaを断固擁護したい。というのも、PHPやOSにゆだねられるものはそちらを優先するというのは、まっとうな考え方だからである。
なので(1)-(3)のうちどれかを、ユーザがちゃんと設定すればいいのだが、面倒なので、これも断固、ぼくはやりませんでした(家訓です)。
で、ヘルパーを使うのを諦め、mimeタイプ取得が必要な局面では、
---
$e = strtolower(substr(strrchr(ファイル名, '.'), 1)); $extension = $e[0];
と書いて、Kohana::config('mimes.'.$extension);で取得した。このコードは、Kohana自身が上の(4)的処理で使っているもので、おかげでKohana::configの使い方を覚えたので無駄ではなかったのさ、と言い張っておく。
なお、ファイルタイプを扱うためにはconfig/view.phpの中で、有効にしたい拡張子を加えてやらなければいけません。
view.phpで最初から許可されている拡張子
$config['allowed_filetypes'] = array ( 'gif', 'jpg', 'jpeg', 'png', 'tif', 'tiff', 'swf', 'htm', 'html', 'css', 'js' );