我正在使用下面的代码进行文件验证。奇怪的是,如果我尝试上传超过大小限制的文件,我得到的不是空错误,而是与大小限制相关的错误。谁能解释问题出在哪里?
$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;
}
您可以通过更改验证数组中元素的顺序来解决此问题,即更改
$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 服务器阻止的文件来测试您的应用程序。 最有可能的罪魁祸首是 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']);
}
}