cakePHP文件上传的可选验证

时间:2010-06-30 06:34:13

标签: validation cakephp file-upload cakephp-1.3

如何通过验证将文件上传作为可选项? 即使我没有选择任何文件,下面的代码也会验证。 我只想在选择文件时检查扩展名。 如果我没有选择任何文件,则不应返回任何验证错误。

class Catalog extends AppModel{
    var $name = 'Catalog';
    var $validate = array(
        'name' => array(
            'rule' => '/^[a-z0-9 ]{0,}$/i',
            'allowEmpty' => false,
            'message' => 'Invalid Catalog name'
        ),
        'imageupload' => array(
            'rule' => array('extension',array('jpeg','jpg','png','gif')),
            'required' => false,
            'allowEmpty' => true,
            'message' => 'Invalid file'
        ),
       );
}

提前致谢

2 个答案:

答案 0 :(得分:2)

  

“我指定$ this->数据['目录'] ['图片'] = $ this-> data ['目录'] ['imageupload'] ['name'];”

因此,当您保存数据数组时,我认为它看起来像这样:

array(
    'image' => 'foobar',
    'imageupload' => array(
        'name' => 'foobar',
        'size' => 1234567,
        'error' => 0,
        ...
     )
)

这意味着,imageupload验证规则正在尝试处理此数据:

array(
    'name' => 'foobar',
    'size' => 1234567,
    'error' => 0,
    ...
 )

即。它试图验证的价值是一系列东西,而不仅仅是一个字符串。这不太可能通过指定的验证规则。它也可能永远不会“空”。

要么创建可以处理此数组的自定义验证规则,要么在尝试验证之前需要在控制器中进行更多处理。

答案 1 :(得分:1)

<强>概念

在Controller中,在验证或保存之前(默认情况下自动进行验证)检查是否上传了任何文件。如果没有上传,则取消设置文件字段的验证器。

示例代码:

控制器

// is any image uploaded?
$isNoFileUploaded = ($this->request->data['Model']['field_name']['error'] == UPLOAD_ERR_NO_FILE) ? true : false ;
if ($isNoFileUploaded) {
    $this->Model->validator()->remove('field_name');
}

备注:

此解决方案作为@deceze's answer

建议的两种替代方法之一(控制器中的预处理,模型中的自定义验证)进行预处理