アップロードファイルのバリデーションルール
CakePHP 2.2や2.3になってファイルアップロードに対するルールがコアバリデーションに追加されているようで、まとめてみました。
コアバリデーション
関連しそうなルールは以下の4つのようです。
fileSize - ファイルサイズについて
mimeType - MIMEタイプについて
uploadError - ファイルアップロードのエラー有無について
extension - 拡張子について
ファイルアップロードフォームから受け取るデータ配列
簡単なフォームの例
<?php
echo $this->Form->create( 'File', array( 'type'=>'> file', 'enctype' => 'multipart/form-data', 'url'=>'/upload/'));
echo $this->Form->input( 'image', array( 'type' => 'file'));
echo $this->Form->submit( __('Upload'));
echo $this->Form->end();
?>
上記のフォームから受け取るこんな感じだと思います。
[File] => Array
(
[image] => Array
(
[name] => 5231ddd0ccdbf_thumb.jpg
[type] => image/jpeg
[tmp_name] => /var/tmp/phpCN8Bo8
[error] => 0
[size] => 4613
)
)
バリデーションルールを設定
配列がネストしているのでバリデーションルールもネストする必要があるのかなと思ったのですが、Cake側でやってくれるようで、そのまま定義すればいいようです。
ポイントは、「uploadError」ルールを先頭にもってくることでしょうか? ファイル未選択で空の場合にはここではじかないと、その他のルールを実行しようとしてエラーが発生してしまいます。
// モデル:File.php
public $validate = array(
'image' => array(
// ルール:uploadError => errorを検証 (2.2 以降)
'upload-file' => array(
'rule' => array( 'uploadError'),
'message' => array( 'Error uploading file')
),
// ルール:extension => pathinfoを使用して拡張子を検証
'extension' => array(
'rule' => array( 'extension', array(
'jpg', 'jpeg', 'png', 'gif') // 拡張子を配列で定義
),
'message' => array( 'file extension error')
),
// ルール:mimeType =>
// finfo_file(もしくは、mime_content_type)でファイルのmimeを検証 (2.2 以降)
// 2.5 以降 - MIMEタイプを正規表現(文字列)で設定可能に
'mimetype' => array(
'rule' => array( 'mimeType', array(
'image/jpeg', 'image/png', 'image/gif') // MIMEタイプを配列で定義
),
'message' => array( 'MIME type error')
),
// ルール:fileSize => filesizeでファイルサイズを検証(2GBまで) (2.3 以降)
'size' => array(
'maxFileSize' => array(
'rule' => array( 'fileSize', '<=', '10MB'), // 10M以下
'message' => array( 'file size error')
),
'minFileSize' => array(
'rule' => array( 'fileSize', '>', 0), // 0バイトより大
'message' => array( 'file size error')
),
),
),
);
ファイル名の長さを検証するケースはあまり無いと思いますが、自作する必要があるようですね。(存在してたらすいません)
処理の流れの注意点
通常の流れは、「ファイルアップロード」→「バリデーション」→「ファイル移動(move_uploaded_file)」→「ファイル情報save」のような感じになると思います。
mimeTypeのバリデーション処理では、tmp_nameにあるファイルからmime情報を取得してバリデーションを行うため、save時は、'validate' => falseを付与して、バリデーション処理をスキップさせて下さい。(コントローラ内でバリデーション処理を呼び出す)
そうしないと既に移動されて存在しないファイルに対してバリデーション処理をおこなうためエラー("Can not determine the mimetype.")となってしまいます。
// バリデーション
$this->File->set( $this->request->data );
if ($this->File->validates( array( 'fieldList' => array( 'image')))) {
// ファイル移動
if( move_uploaded_file( $this->request->data['File']['image']['tmp_name'], IMAGES . 「ファイルパス」) ){
// save
if( $this->File->save( $this->request->data, array( 'validate' => false)) ) {
} else {
// saveエラーの場合
}
} else {
// ファイル移動エラーの場合
}
} else {
// バリデーションNGの場合
}
(ファイル情報saveしてからファイル移動(move_uploaded_file)であれば、問題ないと思いますが。)
Models > Data Validation
関連記事
-
-
入力文字列の長さ(文字数)をバリデーション
CakePHP 2には、コアバリデーションに文字列の長さを検証する関数が用意されています。 文字列長(コア)バリデーション minLength - 最小文字数以上であること maxLengt
-
-
radioボタンを実装
Radioボタンの実装は、セレクトボックスとほぼ同じです。 個人的にはラジオボタンをすすんで使用することは少ないのですが、2択くらいの選択肢であれば非常に便利ですよね。 今回は、その実装方法 デモ
-
-
ハッシュ関数の選択とハッシュ化処理
CakePHPでは、ログイン時にはpasswordを自動的にハッシュ化して認証を行ってくれますが、そのパスワードを登録する際は、明示的にハッシュ化する必要があります。 ハッシュ関数の選択 ハッ
-
-
CakePHP 2.x インストール
現在まで私が商用・非商用にリリースしているCakePHPアプリケーションは全て1.3.xベースで作成しています。 まだまだロードマップ的には大丈夫そうですが、お客さん向けに納品しているアプリケーショ
-
-
バリデーション前後に処理を追加できる「beforeValidate」「afterValidate」
CakePHPでは、「beforeValidate」「afterValidate」というバリデーション処理の前後で追加の処理を実装できるコールバック関数が用意されています。 beforeVali
-
-
CSS/JSをひとまとめにして軽量化するプラグイン「Minify plugin for CakePHP」
「Minify plugin for CakePHP」は、インクルードするCSSもしくはJSファイルをひとまとめにしてキャッシュ化してくれるプラグインです。 導入 ダウンロード・解凍し
-
-
複数ファイルアップロードフォーム
CakePHP 2.0からはHTML5が標準でサポートとなり、複数ファイルアップロードのためのフォーム記述が容易になりました。 View (ビュー) 配列 Array (
-
-
HttpSocketを使用してリクエスト送信
CakePHPには、Webサービスへのリクエスト送信のためのHttpSocketクラスが用意されています。 HttpSocket get HTTP GETリクエストを発行します。デモ H
-
-
コントローラ内でバリデーション処理を呼び出す
CakePHPでは、saveメソッドの際にバリデーション処理も自動で行われますが、save処理と切り離してバリデーションを行うこともできます。このときは、save時と若干異なる処理体系になります。
-
-
Blowfishを使用してハッシュ化する
使用方法 Blowfishを採用してハッシュ化を行う場合、Securityクラスのhashメソッドを呼び出します。第2引数に'blowfish'を指定し、第3引数を指定しないもしくはfalseにしま



Comment
なるー
[…] http://kwski.net/cakephp-2-x/1152/ […]
[…] http://kwski.net/cakephp-2-x/1152/ […]
アップロードファイルのバリデーションルール #CakePHP #trick876 #validation
http://t.co/1kGisLqpp7