Your browser (Internet Explorer 6) is out of date. It has known security flaws and may not display all features of this and other websites. Learn how to update your browser.
X
Post

Zend FrameworkでMimeTypeチェックを行う時の注意点

Zend Frameworkネタです。
ファイルアップロード回りについて機能整理していたら引っかかった箇所。



http://framework.zend.com/manual/ja/zend.file.transfer.validators.html


Zend_File_Transferでファイルのバリデーションを行うとき、
MimeTypeのチェックによるバリデーションも可能です。

しかし場合によってはphpの設定を修正しないと
MimeTypeチェックが正常に動作しません。

floatingdays: PHPで画像ファイルの Mime-Type (Content-Type)を取得する方法

こちらのページによるとMimeTypeを検出する方法は4つありますが、
この中で上2つは画像に限定した方法であるため、
画像以外のファイルにも利用可能なのは2つになります。

Zend Frameworkではまず4つ目の方法、
次にモジュールが設定されていなければ3つ目の方法を試すようになっています。
どちらも駄目だった時にはMimeTypeが検出できないものとしてエラーを返します。

このようになった時はphp.iniの次の行のコメントアウトを外します。
これによりfinfoクラスが利用可能となり、MimeTypeが検出可能になります。

; extension=php_fileinfo.dll

これは公式ドキュメントにも書かれている内容ですが、
非常に簡単に書かれていて見落としやすくなっています。


また、公式マニュアルにもあるように
バリデーション中に「headerCheck」オプションがあり、
これを有効にすると前のMimeType取得用モジュールがなかった時には
代替手段としてアップロードしたファイル情報からtype属性を取得してきます。

では、これを使えば前述のモジュールがなくても大丈夫かというとそうでもなく……
mime_content_typeもfileinfoも使えない場合、
常にtypeがapplication/octet-streamとなりました。

自分の環境ではphp_fileinfo.dllが無効の時にapplication/octet-streamとなり、
有効にするとtype属性からでも正常にMimeTypeが検出できるようになりました。

残念ながらこのあたりの情報をまとめたページを見つけられなかったのですが
どうもphpの設定によってはアップロードファイルのMimeTypeを取得できないようです。


つまり、Mime判定用モジュールが有効でないならファイルの情報から取得するけど、
モジュールがないとそれもちゃんと解釈しないからどちらにしても意味がないという……


やはりphp_fileinfo.dllが必要という事に変わりがないようです。

TrackBack URL :

Leave a comment  

name

email

website

Submit comment