【问题标题】:Kohana 3 - file size validationKohana 3 - 文件大小验证
【发布时间】:2013-01-31 19:13:09
【问题描述】:

我正在使用以下代码进行文件验证。奇怪的是,如果我尝试上传超过大小限制的文件,我得到的不是空错误,而是与大小限制相关的错误。谁能解释问题出在哪里?

$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;
             }

【问题讨论】:

    标签: kohana-3


    【解决方案1】:

    您可以通过更改验证数组中元素的顺序来解决此问题,即更改

    $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,参见。 this page from the PHP manual。这意味着文件上传是空的(如,没有文件),因为被 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']);
        }
    
    }
    

    【讨论】:

    • 感谢 dvijaz,帮助更改数组中元素的顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    相关资源
    最近更新 更多