2010-06-30 96 views
3

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

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

由于事先

+0

你是否以任何方式预处理控制器中的'imageupload'字段? – deceze 2010-06-30 07:09:23

+0

@deceze:对不起,你是什么意思的预处理? 我只需要保存图像名,所以我分配$ this-> data ['Catalog'] ['image'] = $ this-> data ['Catalog'] ['imageupload'] ['name']; 那么只有我会打电话保存 – RSK 2010-06-30 08:29:49

+0

这就是我的意思是预处理。 – deceze 2010-06-30 09:45:04

回答

2

“我分配$这 - >数据[ '目录'] [ '图像'] = $这 - >数据[ '目录'] [ 'imageupload'] ['名称'];”

所以你的时间保存数据阵列,它看起来像这样我假设:

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

这意味着,在imageupload验证规则正试图以这个数据的工作:

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

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

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

+0

这是最佳做法???自定义验证或控制器中的一些更多处理 – RSK 2010-06-30 10:10:45

+0

个人而言,我会在保存之前用'$ this-> data'修饰,尽管我认为自定义规则会更好。 – 2010-06-30 10:11:52

+0

thankz deceze和david ......我会去自定义验证 – RSK 2010-06-30 10:13:50

1

概念:

在控制器,验证,或保存(默认情况下自动执行验证)检查是否有任何文件被上传之前。如果没有上传,则取消对文件字段的验证器。

样品的编号:

控制器

// 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提供