[FuelPHP] アップロードしたファイルのバリデーションをする方法

アップロードされたファイルをチェックしたかったので…。

#背景

DB へインサートした後に得られるシーケンス番号をファイル名にしたい。

この時に入力値が不正だとインサート処理が上手く実行できず、シーケンス番号が取得できない。また、選択されたファイルが不正だった場合は、DB へのインサート処理をロールバックしなければならない。

このような無駄な処理を未然に防ぐには、入力値とファイルのチェックを行った後にDB処理をするのが好ましい。(当社比)

(アップロード時に発生したエラーはしょうがないので、あとでどうにかする)

#ファイルのバリデーション

アップロード処理後にエラーがあればそれを返却したりするのだが、今回はアップロードの処理は行わず、エラーメッセージのみ取得しておく。

Upload クラスを使う。Upload::save()などは使わずにUpload::get_errors()でエラーを見てみる。

public static function validate_image() {
  $message = '';
 
  try {

    Upload::process(array(
      'max_size'           => 2097152,
      'randomize'           => false,
      'normalize'           => true,
      'overwrite'           => true,
      'auto_rename'      => false,
      'ext_whitelist'      => array(
                              'jpg',
                              'jpeg',
                              'gif',
                              'png'
                           ),
    ));

    // 検証
    foreach( Upload::get_errors() as $file ) {
      // ファイルをアップロードしていない場合
      if( $file['name'] == '' && $file['type'] == '' && $file['size'] == 0 ) {
        $message = 'ファイルを選択してください';
      } else {
        foreach( $file['errors'] as $error ) {
          $message = $error['message'];
        }
      }
    }
   
  } catch(Exception $e) {
    $message = $e->getMessage();
  }
 
  return $message;
}

戻り値にメッセージが入ってると引っかかってるような感じ。

ざっくりとした作りなので実運用の時はきちんとエラーハンドリングとかしよう。

#まとめ

フロント側でファイル選択時にチェックする方法などもある。ただ、これだけでは心もとないのでサーバサイド側のチェックもきちんとしていきたい。