我正在尝试验证cakephp文件上传
下面是我的视图
中的输入<?php echo $this->Form->input('images.', array('type' => 'file', 'multiple', 'label'=>'Upload Images to your gallery')); ?>
这是我在浏览器中得到的html代码
<input type="file" required="required" id="ProjectImages" multiple="multiple" name="data[Project][images][]" />
以下是我的模型中验证
的代码'images[]' => array(
'extension' => array(
'rule' => array(
'extension' => array('jpeg', 'png', 'jpg'),
'message' => 'Please supply valid images'
)
),
'size' => array(
'rule' => array('fileSize', '<=', '2MB'),
'message' => 'Image must be less than 2MB'
)
)
我也尝试用'image'作为字段名进行验证,但两者都不起作用。文件正在正确上传,但验证不起作用。
请帮助。谢谢你
请查看这里链接的线程- Cakephp:多个文件上传字段设置自动为必需
我建议您尝试将模型中的验证命名为images
而不是images[]
。如果这仍然不起作用,我建议您在模型中编写自定义beforeSave
函数并自己处理验证。您可以使用以下函数来执行验证:
public function isValidImageFile($filename) {
if($this->checkFileUploadedName($filename) &&
$this->checkFileUploadedLength($filename) &&
$this->checkImgFileExtn($filename)) {
return true;
}
return false;
}
private function checkFileUploadedName($filename)
{
return (bool) ((preg_match("`^[-0-9A-Z_'.]+$`i",$filename)) ? true : false);
}
private function checkFileUploadedLength($filename)
{
return (bool) ((mb_strlen($filename,"UTF-8") < 225) ? true : false);
}
private function checkImgFileExtn($filename) {
$file_parts = pathinfo($filename);
$supportedFileTypes = array('jpg', 'png', 'jpeg', 'bmp');
if(in_array(strtolower($file_parts['extension']), $supportedFileTypes)) {
return true;
}
return false;
}
你可以用另一种方法来检查文件大小。您可以使用php - filesize方法检查文件大小。
尝试将名称改为images
而不是images[]
,并更正扩展规则,请参阅文档此处
'images' => array(
'extension' => array(
'rule' => array(
'extension',array('jpeg', 'png', 'jpg')
),
'message' => 'Please supply valid images'
),
'size' => array(
'rule' => array('fileSize', '<=', '2MB'),
'message' => 'Image must be less than 2MB'
)
)
验证规则,如mimeType或fileSize似乎不工作在多个上传数组,你必须通过自定义规则进行验证:
$validator->add('uploads', [
'fileSizeSum' => [
'rule' => function($value, $context) {
$fileSizeSumLimit = Configure::read('uploads')['max_uploadsize'];
$fileSizeSum = 0;
foreach($value as $key => $val) {
$fileSizeSum += $val['size'];
if( $fileSizeSum > $fileSizeSumLimit || $val['size'] > $fileSizeSumLimit ) {
return false;
}
}
return true;
},
'on' => function ($context) {
return ! empty($context['data']['uploads'][0]['size']);
},
'message' => __('Uploadlimit x MB!'),
],
'extension' => [
'rule' => function($value, $context) {
$supportedFileTypes = Configure::read('uploads')['allowed_mimetypes'];
foreach($value as $key => $val) {
$ext = pathinfo($val['name'], PATHINFO_EXTENSION);
if( ! empty($ext) && ! in_array($ext, $supportedFileTypes) ) {
return false;
}
}
return true;
},
'on' => function ($context) {
return ! empty($context['data']['uploads'][0]['type']);
},
'message' => __('Allowed Mimetypes: '). implode(', ', Configure::read('uploads')['allowed_mimetypes_userrequest']),
]
]);