0

ファイルの検証に以下のコードを使用しています。奇妙なことは、サイズ制限を超えるファイルをアップロードしようとすると、サイズ制限に関連するエラーではなく、空ではないというエラーが発生することです。誰が問題がどこにあるのか説明できますか?

$validate = Validate::factory($_FILES);
             $validate->rules('image',
                     array(
                     'Upload::valid' => array(),
                     'Upload::not_empty' => array(), 
                     'Upload::type' =>array('Upload::type' => array('jpg','png','gif')), 
                     'Upload::size' => array('1M'))
                     );


             if ($validate->check())
            {           
             //ok
             $directory = DOCROOT.'uploads/';
             $filepath = Upload::save($_FILES['image'], '123zxhahaxdfdgsdfsdha.jpg', $directory);   
             Request::instance()->redirect($redirect);                  
            }
             else
             {
             //error    
                 $this->errors = $validate->errors('errors');
                 $errors = $this->errors;
             //echo $errors;
             }
4

1 に答える 1

3

これは、検証配列の要素の順序を変更することで修正できます。つまり、

$validate->rules(
    'image',
    array(
        'Upload::valid' => array(),
        'Upload::not_empty' => array(), 
        'Upload::type' =>array('Upload::type' => array('jpg','png','gif')), 
        'Upload::size' => array('1M'),
    )
);

$validate->rules(
    'image',
    array(
        'Upload::valid' => array(),
        'Upload::size' => array('1M'),
        'Upload::not_empty' => array(), 
        'Upload::type' =>array('Upload::type' => array('jpg','png','gif')), 
    )
);

「うっ‽」と思われたかもしれません。まあ、Kohana で検証ルールが処理される方法では、チェッカーはそれ以上のルールのチェックを停止します。これを自分で確認したい場合は、 で次の行を探してくださいsystem/classes/kohana/validate.php

    //This field has an error, stop executing rules.
    break;

これらは、使用しているように見える Kohana 3.0 だけでなく、現在の 3.3 でも見つかります。

おそらく、PHP や Web サーバーによってブロックされるほど大きなサイズのファイルをアップロードして、アプリケーションをテストしていたと思われます。最も可能性の高い原因はupload_max_filesize、PHP の値です。デフォルトの PHP インストールでは 2M しかありません。PHPマニュアルのこのページ。これは、大きすぎるために PHP によってブロックされているため、ファイルのアップロードが空であることを意味します (つまり、ファイルがありません)。

それは、あなたのコードがあなたが報告した動作を与えていた理由を説明するでしょう. しかし、Kohana のUpload::size関数は (もちろん!) ファイル サイズが大きすぎることを検出するのに十分なほど巧妙ですsystem/classes/kohana/upload.php

    if ($file['error'] === UPLOAD_ERR_INI_SIZE)
    {
        // Upload is larger than PHP allowed size
        return FALSE;
    }

したがって、最初にそれをチェックすると、そのルールで失敗します。そのため、コードを再シャッフルすると、報告された望ましくない動作が取り除かれます。

他の 2 つの関連するコメント:

まず、次のsystem/classes/kohana/upload.phpコメントに気付くでしょう。

If you _do_ require a file to be uploaded, add
the [Upload::not_empty] rule before this rule.

しかしbefore、TBH は誤解を招く/間違っていると思うので、検証ルールを並べ替えるときにそれを考慮しいません。それらのフィールドの値。

次に、はファイル サイズが 0 より大きいかどうかをチェックUpload::not_emptyしないことに注意してください。application/classes/upload.php次の内容で作成できるようにします。

class Upload extends Kohana_Upload {

    public static function not_empty(array $file)
    {
        return (parent::not_empty($file)
            AND $file['size']);
    }

}
于 2013-02-11T22:33:43.583 に答える