1つのページで複数のファイルをアップする必要があったのでその際に対応したことをメモ。
やりたかったことは、画像ファイルとテキストファイルを同時にPOSTで登録するでした。
その際に拡張子のチェックを各々チェックしたい。しかし、FuelPHPのFuel\Core\Upload ではできそうになかったので
独自に拡張して対応してみた。
まずは通常のファイルアップロードの流れは下記の流れとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Upload::process(array( 'max_size' => 10240, 'auto_rename' => false, 'overwrite' => true, 'ext_whitelist' => array('jpg', 'jpeg', 'gif', 'png', 'txt'), )); if (Upload::is_valid()) { Upload::save(); } else { // エラーを処理する foreach (Upload::get_errors() as $file) { // $file はファイル情報の配列 // $file['errors'] は発生したエラーの内容を含む配列で、 // 配列の要素は 'error' と 'message' を含む配列 } } |
この場合、設定できるext_whitelistは、画像系とテキスト系の両方を設定することしかできませんでした。
このままでは、画像ファイルのinputにはテキストファイルをアップしたくないのにバリデーションではじくことができません。
なので、Fuel\Core\Uploadを拡張して対応しました。
まずは、coreクラスを拡張するためのクラスを作成します。
※仮に「app/classes/core/upload.php」に作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class Upload extends Fuel\Core\Upload { // --------------------------------------------------------------------------- /** * Process the uploaded files, and run the validation * * @return void */ public static function process($config = array(), $flag = true) { foreach (static::$upload->getAllFiles() as $file) { if ($flag) { $file->setConfig($config); $file->validate(); } else { // config内のキーにcurrent名があればそれに一致した設定をセット if (array_key_exists($file->current(), $config)) { $file->setConfig($config[$file->current()]); $file->validate(); // ない場合はarrayをセット } else { $file->setConfig(array()); $file->validate(); } } } } } |
これを、app/bootstrap.phpに記述します。
1 2 3 4 5 |
\Autoloader::add_classes(array( // Add classes you want to override here // Example: 'View' => APPPATH.'classes/view.php', 'Upload' => APPPATH.'classes/core/upload.php', // ここです。 )); |
あとは下記のような使い方をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
$config['text_file'] = [ 'max_size' => 10240, 'auto_rename' => false, 'overwrite' => true, 'ext_whitelist' => array('txt', ) ]; $config['image_file'] = [ 'max_size' => 10240, 'auto_rename' => false, 'overwrite' => true, 'ext_whitelist' => array('jpg', 'jpeg', 'gif', 'png', ) ]; Upload::process($config, false); // テキストファイル $txt_error = Upload::get_errors('thumbnail'); if (isset($txt_error ['errors'])) { // エラー処理を書く } // 画像ファイル $img_error = Upload::get_errors('image_file'); if (isset($img_error ['errors'])) { // エラー処理を書く } // エラーがなければ if ( //エラーの判定処理 ) { Upload::save(); // DBへ登録とかなにかを処理する } |
みたいな感じで対応しました。
もっと良い方法もあるかもですが、一応対応できた。
※ 一切責任を負いかねますので、あしからず。