Cakephp:多文件验证

Cakephp:多文件验证,php,validation,cakephp,Php,Validation,Cakephp,我想用cakephp制作一个照片管理器。除了一件事之外,一切都按照我的预期进行。我似乎无法正确验证多个文件 我使用了一个名为Image的模型,在这里我验证了表单中的数据。 在我看来,这就是形式 <?php echo $this->Form->create('Image', array( 'type' => 'file', 'url' => array_merge(array('action' =>

我想用cakephp制作一个照片管理器。除了一件事之外,一切都按照我的预期进行。我似乎无法正确验证多个文件

我使用了一个名为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();
?>
第二次编辑ndm他的回答是正确的,在重新格式化我的数据后,这就是我发送给saveAll函数的数组的外观

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', /* ... */)
        )
    ),
);

对于您当前使用的格式,它会将键
名称
类型
等视为要保存/验证的字段,而不是
图像管理器
,因此会出现验证错误


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

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


相应地调整您的自定义验证规则 现在,随着格式的更改,您很可能需要调整自定义的
processUpload
验证规则,因为传递给它的数据的格式将不同


另一方面,如果规则实际将文件移动/存储到磁盘上,这不是验证应该负责的,最好在
Model::beforeSave()
Model::afterSave()中完成
回调。

是否为每个文件显示?请正确检查规则。如果您显示
…数据['Image']['Image\u manager']]
实际包含的内容,则会有所帮助。您可能以错误的格式传递了数据。有关正确的格式,请参阅。我已添加了一个示例,说明
数据['Image']['Image\u manager']
中可能存在的问题。我没有立即发现第一次浏览时出现错误,因为它的格式肯定不正确。在我回答这个问题之前,是不是不应该为
图像
模型创建表单?ie
字段
平面
实际上并不属于
图像
模型,而是
图像
模型与这些字段在
xxx中所属的任何模型相关联。它确实不是用于图像模型。我的同事告诉我尝试使用图像模型,因为文件验证需要相同的规则。但该图像模型(尚未)与任何其他模型关联。这将是下一步。我还可以告诉您,photomanager位于app=>plugin文件夹中,而图像模型位于app=>model中。(我不知道这可能有多重要,但可能会有所帮助。)谢谢你,这很有魅力。我在我的问题中添加了一个重新格式化数据的示例,供遇到相同问题的人使用。我应该更加注意文档中的格式。Cakephp对我来说仍然有些模糊。
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
    )

)
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
            )

    )

)
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', /* ... */)
        )
    ),
);
App::uses('Hash', 'Utility');

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