我试图在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
)
)
)
答案 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', /* ... */)
)
),
);
使用您当前使用的格式,它会将密钥name
,type
等视为要保存/验证的字段,而不是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()
回调。