ファイルの管理がいい加減で、拡張子がなく、調べるのが面倒なファイルが出来てしまった。
symfonyでアップロードするときにしっかり保存しておけばよかった。
ファイルの拡張子を調べる
アップロードするときに調べる方法は、簡単FileInfoを使う。
なんとPHP5.3からは標準に組み込みになるそうだ。
オススメは、オブジェクト指向のFileInfo。
<?php $fo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); $ret = $fo->file($file); print $ret; ?>
これを実行すると出力にはMIME形式でファイルの種類が表示される。
$>php file_info.php
image/jpeg
ファイルでなくてもイイ
データベースに格納しているファイルや、BASE64で送信されたファイル。ファイルのバイナリがある時は次のようにする。
<?php $file_contet = file_get_contents($file_name); $fo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); $ret = $fo->buffer($file_contet); print $ret; ?>
取得に関しては、MIME関連のライブラリを使うのでおおむね良好だった。
symfonyなどでアップロードされるファイルを画像に制限したいとき。
FileInfoを用いることで簡単に画像かどうかチェックができる。
symfonyソースを読んでみたが、画像アップロード処理は放置されていて、
組み込み変数$_FILESを返すだけという仕様。ファイルのチェックやバリデーションも特にない。
action.class.php内にて
public function validateUpload($req=null){ $req = $req ? $req : $this->getRequest(); foreach( $req->getFiles() as $TMP_FILE ){ if( $this->is_image_file( file_get_contents($TMP_FILE['temp_name']))){ move_uploaded_file( $TMP_FILE['temp_name'], "symfony_root"."/data/pics/".time() ); }; } } private function is_image_file($file_contet){ $fo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); $ret = $fo->buffer($file_contet); print strpos($ret, "image") !== false; }