Cakephp验证文件上传的“多重”


Cakephp validating file upload "multiple"

我正在尝试验证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']),
    ]
]);