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_File_Transferの複数ファイルバリデーションについて

Zend Frameworkネタです。
前回の記事に関連し、Zend_File_Transferに関わる話です。


Zend_File_Transferでのアップロードファイルのバリデーションは
大半が個々のファイルに対するチェックですが、
アップロードしたファイル全体に対して行うチェックが2つあります。

ファイルの件数をチェックするCountと、ファイルの合計容量FilesSizeです。
このバリデーションの挙動についての話。




前の記事で書いたように、
Zend_File_Transferではバリデーションのインスタンスを一つ生成し、
その設定を使いまわすようになっています。

Countでファイル数のカウントは次のように動作します。

・isValidでファイルを指定しない場合、全てのファイルをカウントする
・isValidでファイルを指定する場合、対象のファイルのみをカウントする
・isValidを複数回呼び出す時、前のファイルの情報はリセットせずに残る。
 そのため、ファイル指定で複数回実行するとカウント数が上がってくる。


つまり、次のような挙動になります。

/*
 * file_1, file_2, file_3のファイル入力フォームがあり、
 * file_1とfile_3に対してアップロードしたものとする
 */ 

// isValidでファイルを指定しないと全てのファイルを確認する。ここでは2
$upload = new Zend_File_Transfer(); 
$upload->addValidator('Count', false, array('min' => 2, 'max' => 4)); 

// ここでは2とカウントされる
if(!$upload->isValid()){
    var_dump($upload->getMessages());
}


// isValidでファイルを指定すると、実行するごとにファイルを追加する
$upload = new Zend_File_Transfer(); 
$upload->addValidator('Count', false, array('min' => 2, 'max' => 4)); 


// ここでは1とカウントされる
if(!$upload->isValid('file_1')){
    var_dump($upload->getMessages());
}

// ここでは1とカウントされる
if(!$upload->isValid('file_2')){
    var_dump($upload->getMessages());
}

// ここでは2とカウントされる
if(!$upload->isValid('file_3')){
    var_dump($upload->getMessages());
}

こんな感じで、isValidを個別のファイルに対して
呼び出すとちょっとカウントがおかしくなります。


複数ファイルのバリデーションを行ったとき、
全ファイルに対して一度にisValidを行うと
どのファイルに対するエラーメッセージか分からなくなるため
ラッパクラス内では個別にisValidを実行してメッセージ管理しやすくしたのですが、
その事でカウントのバリデーションが思うように動作しなくなっているようです。


ちなみにFilesSizeは、
isValidで全ファイルを指定した場合でも
順に足してチェックをするようになっています。
そのため、元よりファイルサイズ下限のチェックが正常に動作しないようです。

/*
 * file_1, file_2, file_3のファイル入力フォームがあり、
 * それぞれに対してファイルがアップロードされたものとする。
 */ 
$upload = new Zend_File_Transfer(); 
$upload->addValidator('FilesSize', false, array('min' => '10kB', 'max' => '100kB')); 


/*
 * file_1はfile_1のサイズ、
 * file_2はfile_1とfile_2の合計サイズ、
 * file_3はfile_1, file_2, file_3の合計サイズで計算される
 */
if(!$upload->isValid()){
    var_dump($upload->getMessages());
}


まあ乗りかかった船だし、対応方法も大体イメージわいてるので
この際に全部まとめて直してしまおうと思うのですが、
結構面倒なところに手を突っ込んでしまったな、と思ったり。

TrackBack URL :

Leave a comment  

name

email

website

Submit comment