cakePHP optional validation for file upload

久未见 提交于 2019-12-19 09:54:05

问题


How to make file uploading as optional with validation? The code below validates even if i didn't selected any file. I want to check the extension only if i selected the the file. If i am not selecting any file it should not return any validation error.

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

thanks in advance


回答1:


"I assign $this->data['Catalog']['image'] = $this->data['Catalog']['imageupload']['name'];"

So by the time you save your data array, it looks something like this I assume:

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

Which means, the imageupload validation rule is trying to work on this data:

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

I.e. the value it's trying to validate is an array of stuff, not just a string. And that is unlikely to pass the specified validation rule. It's also probably never "empty".

Either you create a custom validation rule that can handle this array, or you need to do some more processing in the controller before you try to validate it.




回答2:


Concept:

In Controller, before validating, or saving (which does validation automatically by default) check if any file is uploaded. If not uploaded, then unset validator for the file field.

Sample code:

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

Notes:

This solution comes under preprocessing as one of the two alternative approaches (preprocessing in controller, custom validation in model) suggested by @deceze's answer



来源:https://stackoverflow.com/questions/3146933/cakephp-optional-validation-for-file-upload

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!