2010年9月28日火曜日

Zend FrameworkのMimeType Validatorがうまく動かない。

Zendを使っていて、
Zend_File_Transfer_Adapter_Httpでファイルをアップロードするとき、
$adapter->addValidator('MimeType', false, array('image/gif', 'image/png', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/x-png')); // jpg, png, gif
こんなんとか、
$adapter->addValidator('IsImage', false);
こんなんとかを使ってMimeTypeのチェックをしようと思ったが、なぜかうまくいかない。

見ると、
Zend_Validate_File_IsImage::NOT_DETECTED
のエラーを吐いてる。

どうやらmimetypeが取得できないみたい。

コードに問題はなさそうだし、なんか挙動がよくわからないので、Zend/Validate/File/MimeType.php の中身を見る。

追っていくと、途中の

} else if (!(class_exists('finfo', false))) {

に引っかかって Exceptionが飛んでる。

どうやらfinfoがないみたい。
調べると pecl経由でfileinfoを入れればよさそう。
(自分の環境はCentOS 5.5)

一応チェック
$ php -i | grep fileinfo
(何も出ない)

なので、やっぱり入ってないみたい。
うーむ、しかし内部的に finfo_open()を使ってるんだなー。。。

というわけで、fileinfoをインストール。

peclでphpizeを使うため、手始めにphp-develをインストール。
$ sudo yum install php-devel

.....

Installed:
  php-devel.x86_64 0:5.2.10-1.el5.centos

Complete!

続いて、peclコマンドでfileinfoをインストール。
$ sudo pecl install fileinfo

.....

Build process completed successfully
Installing '/usr/lib64/php/modules/fileinfo.so'
install ok: channel://pear.php.net/Fileinfo-1.0.4

これでOK。
あとは設定ファイルに書いてモジュールをロードする。

$ sudo vim /etc/php.d/fileinfo.ini

extension=fileinfo.so

で再起動。

$ sudo /etc/init.d/httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]

$ php -i | grep fileinfo
/etc/php.d/fileinfo.ini,
fileinfo
fileinfo support => enabled

enabledになってればOK


これでMimeTypeのチェックがちゃんと動いた。