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')), 
    )
);

“Wut‽”,你可能已经想到了。好吧,在 Kohana 中处理验证规则的方式,检查器停止检查更多规则。如果您想亲自查看,请在以下位置查找这些行system/classes/kohana/validate.php

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

您会在您似乎正在使用的 Kohana 3.0 中找到它们,但在当前的 3.3 中也可以找到它们。

并且您大概是通过上传一个大小足以被 PHP 甚至您的 Web 服务器阻止的文件来测试您的应用程序。最可能的罪魁祸首是 PHP 的upload_max_filesize值,在默认的 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;
    }

因此,如果它首先检查,它将在该规则上失败,这就是为什么我对您的代码的重新洗牌应该摆脱您报告的不需要的行为。

另外两个相切的评论:

首先,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 我认为它具有误导性/不正确:在对这些字段的值。

其次,注意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 回答