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

提前致谢

4

2 回答 2

2

“我分配 $this->data['Catalog']['image'] = $this->data['Catalog']['imageupload']['name'];”

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

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

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

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

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

您可以创建一个可以处理此数组的自定义验证规则,或者您需要在控制器中进行更多处理,然后再尝试验证它。

于 2010-06-30T09:52:02.747 回答
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 的答案建议的两种替代方法之一(控制器中的预处理,模型中的自定义验证)进行预处理

于 2014-10-11T09:58:18.880 回答