Cakephp:多文件验证

时间:2014-07-24 12:25:08

标签: php validation cakephp

我试图在cakephp中制作一个photomanager。除了一件事,一切都按照我的期望去做。我似乎无法正确验证多个文件。

我使用名为Image的模型,我从表单中验证数据。 这是我视图中的表单

<?php
        echo $this->Form->create('Image', array(
            'type' => 'file',
            'url' => array_merge(array('action' => 'index'), $this->params['pass']),
            'inputDefaults' => array(
                'div' => 'form-group',
                'wrapInput' => false,
                'label' => false,
                'class' => 'form-control'
                ),
            'class' => 'well form-inline'   
            ));
        echo $this->Form->input('Image.image_manager.', array('type' => 'file', 'multiple'));
        echo $this->Form->input('field', array(
            'options' => $imageData['buildings'],
            'empty' => '(choose one)',
            'class' => 'form-control buildingSelector'
        ));
        echo '<div class="flatForm">';
        echo $this->Form->input('flat', array(
            'options' => '',
            'empty' => '(choose one)',
            'class' => 'form-control uploadFlat',
            'id' => "success"
        ));
        echo '</div>';
        echo $this->Form->submit(__('Submit'), array(
            'div' => 'form-group',
            'class' => 'btn btn-default pull-left'
        ));
        echo $this->Form->end();
?>

这是我验证所有内容的模型Image:     

public $useTable = false;

public $validate = array(
    'image_manager' => array(
        'uploadError' => array(
            'rule' => 'uploadError',
            'message' => 'Something went wrong with the file upload',
            'required' => TRUE,
            'allowEmpty' => FALSE,
        ),
        'photoSize' => array(
            'rule' => array('fileSize','<=','2MB'),
            'message' => 'Photo size must be less then 2MB.',
            'required' => TRUE,
            'allowEmpty' => FALSE,
        ),
        'mimeType' => array(
            'rule' => array('mimeType', array('image/gif','image/png','image/jpg','image/jpeg')),
            'message' => 'Invalid file, only images allowed',
            'required' => TRUE,
            'allowEmpty' => FALSE
        ),
        'processUpload' => array(
            'rule' => 'processUpload',
            'message' => 'Something went wrong processing your file',
            'required' => TRUE,
            'allowEmpty' => FALSE,
            'last' => TRUE,
        ),
        'type' => array()
    ),
);

这就是我在控制器中验证的方式:

$this->Image->set($this->request->data['Image']['image_manager']);
if($this->Image->saveAll($this->request->data['Image']['image_manager'], array('validate' => 'only')))
{
    //do something
}else{
    echo '<pre>';
    debug($this->Image->validationErrors);
    echo '</pre>';
}

问题是,当我尝试验证它时,返回遇到错误+第一次验证的错误消息,其中需要设置为true。

所以,让我们说uploadError的必需设置为false,并且filesize的所需设置为true我将得到一个错误的返回+使用filesize定义的错误消息。

当所有必需设置为false时,上传器的工作方式是有意的,但我可以上传其他文件,大文件等...

现在我对cakephp做了相当新的事情,所以这可能是我不知道的愚蠢行为。也许你们其中一个人知道如何正确验证。 提前谢谢。

修改 这是image_manager在尝试上传文件时包含的示例。

Array
(
    [0] => Array
    (
        [name] => Hydrangeas.jpg
        [type] => image/jpeg
        [tmp_name] => /tmp/phpWfut6N
        [error] => 0
        [size] => 595284
    )

    [1] => Array
    (
        [name] => Jellyfish.jpg
        [type] => image/jpeg
        [tmp_name] => /tmp/phpLmxQtx
        [error] => 0
        [size] => 775702
    )

    [2] => Array
    (
        [name] => Tulips.jpg
        [type] => image/jpeg
        [tmp_name] => /tmp/phpi69Hsl
        [error] => 0
        [size] => 620888
    )

)

第二次编辑 ndm他的答案是正确的,重新格式化我的数据后,这就是我发送给saveAll函数的数组的样子

Array
(
    [0] => Array
    (
        [image_manager] => Array
            (
                [name] => Hydrangeas.jpg
                [type] => image/jpeg
                [tmp_name] => /tmp/phpWfut6N
                [error] => 0
                [size] => 595284
            )

    )

    [1] => Array
    (
        [image_manager] => Array
            (
                [name] => Jellyfish.jpg
                [type] => image/jpeg
                [tmp_name] => /tmp/phpLmxQtx
                [error] => 0
                [size] => 775702
            )

    )

    [2] => Array
    (
        [image_manager] => Array
            (
                [name] => Tulips.jpg
                [type] => image/jpeg
                [tmp_name] => /tmp/phpi69Hsl
                [error] => 0
                [size] => 620888
            )

    )

)

1 个答案:

答案 0 :(得分:2)

保存/验证许多

的格式不正确

正如评论中已经指出的那样,数据的格式对于保存或验证许多记录是不正确的,as shown in the docs它应该是

array(
    array('image_manager' => array('name' => 'a', 'type' => 'b', /* ... */)),
    array('image_manager' => array('name' => 'c', 'type' => 'd', /* ... */)),
);

array(
    array(
        'Image' => array(
            'image_manager' => array('name' => 'a', 'type' => 'b', /* ... */)
        )
    ),
    array(
        'Image' => array(
            'image_manager' => array('name' => 'c', 'type' => 'd', /* ... */)
        )
    ),
);

使用您当前使用的格式,它会将密钥nametype等视为要保存/验证的字段,而不是image_manager,因此验证错误。< / p>


手动重新格式化数据

由于您无法更改浏览器发送多个文件的方式,因此您必须在保存/验证数据之前手动重新格式化数据,例如这样(可能最适合您Image模型的方法):

App::uses('Hash', 'Utility');

$data = Hash::map($this->request->data['Image']['image_manager'], '{n}', function($value) {
    return ['image_manager' => $value];
});

这会为您提供上述前一种格式,然后您可以直接将其传递给Model::saveAll()Model::saveMany()

$this->Image->saveMany($data, ['validate' => 'only']);

相应地调整自定义验证规则

现在使用更改的格式,您很可能必须调整自定义processUpload验证规则,因为传递给它的数据格式不同。

在旁注中,如果规则实际上将您的文件移动/存储在磁盘上,那么这不是验证应该负责的事情,那是事后最好在Model::beforeSave()中完成的事情。或Model::afterSave()回调。