« Linux、Mac OS X のファイルシステムでも復元できる | メイン | Dell PowerEdge 1850 »

ethna

アップロード ファイル名のチェック

ethna の regexp チェックは VAR_TYPE_FILE属性の時は効かないので custom で実装してみる。
class APPID_ActionForm extends Ethna_ActionForm{
    var $form_template = array(
        'uploadName' => array(
            'name'        => 'アップロードファイル',
            'required'    => false,    ///    各アクションフォームで必須に
            'form_type'    => FORM_TYPE_FILE,
            'type'        => VAR_TYPE_FILE,
            'max'        => '10000',    ///    10000KBまで
            'custom'    => 'checkFile',
            'extension'    => array( 'zip', 'lzh' ),
            'regexNG'    => '[^\.a-z0-9_-]+',
            'regexp_error'    =>    'ファイル名に禁止文字が含まれています',
        ),
            ...
    );
        ...
    
    /**
    *    カスタムチェックメソッド: アップロードファイルをチェックする
    *        拡張子制限
    *        禁止文字正規表現制限
    *
    *    @access public
    *    @param  string  $name   フォーム項目名
    *    @return object  Ethna_Error エラーオブジェクト(エラーが無い場合はnull)
    */
    function &checkFile( $name ){
        $form_vars = $this->check( $name );
        if ($form_vars == null) {
            return null;
        }
        ///    拡張子制限
        $fileRequest = $_FILES[$name]['name'];
        if( array_key_exists( 'extension', $this->form[$name] ) ){
            $extension = $this->form[$name]['extension'];
            if( ! eregi( '('.implode(')|(',$extension).')$', $fileRequest ) ){
                return $this->action_error->add( $name, "{form}は拡張子「".implode('」「',$extension)."」形式のみです" );
            }
        }
        ///    禁止文字正規表現制限
        if( array_key_exists( 'regexNG', $this->form[$name] ) ){
            $regexNG = $this->form[$name]['regexNG'];
            if( array_key_exists( 'regexp_error', $this->form[$name] ) ){
                $regexp_error = $this->form[$name]['regexp_error'];
            }
            if( eregi( $regexNG, $fileRequest ) ){
                return $this->action_error->add( 'uploadName', $regexp_error, E_FORM_REGEXP );
            }
        }
        return null;
    }
}
あとは、各アクションで
class APPID_Form_Upload extends APPID_ActionForm{
        ...
    var $form = array(
            ...
        'uploadName' => array(
            'required'    => true,
        ),
            ...
    );
}
class APPID_Action_Upload extends APPID_ActionClass{
        ...
    function prepare(){
            ...
        if( 0 < $this->action_form->validate() ){
            return 'form_fileUpload';
        }
            ...
        return null;
    }
        ...
    function perform(){
        ///    アップロードファイルの具体的な処理
    }
}
とすればOK。 追記(2009/03/21):/blog/remix/2009/03/post_174.html

トラックバック

このエントリーのトラックバックURL:
https://www.remix.asia/cgi/mt/mt-tb.cgi/6529

この一覧は、次のエントリーを参照しています: アップロード ファイル名のチェック:

» アップロード ファイル名のチェック その2 送信元 remix.gr.jp
なぜか 「フォーム定義 」 http://ethna.jp/ethna-docu... [詳しくはこちら]

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)