CakePHP 2.6中的高级文件上载验证

时间:2016-01-07 20:12:24

标签: validation cakephp

我有一个用于在CakePHP 2.6应用程序中上传.KML和.KMZ文件的系统,并且遇到了验证问题。

通常情况下,如果您想将文件上传限制为某些文件类型,您可以在模型中添加以下内容:

public $validate = array(
    'file_upload' => array(
        'extension' => array(
            'rule' => array('extension', array('kml', 'kmz')),
             'message' => 'Only KML or KMZ files',
         ),
    )
);

但是,这种检查不会测试文件是否已损坏,或者是否存在其他问题。

我正在使用一个名为beforeSave()的函数来处理$this->data['UploadModel']['upload_file']['tmp_name']中指定的文件,如果它是.KMZ则解压缩到临时文件夹,然后转换为XML文档,迭代节点,并将节点数据转换为我们需要保存的子记录。在这个过程的每一步,都可能出现问题:ZIP可能格式不正确,XML可能格式不正确,XML中可能没有任何有用的数据。

这样做高级文件验证的“正确”方法是什么?我可以将一些逻辑放入自定义验证器函数中,但之后我必须复制大量代码,解压缩文件两次,等等。

1 个答案:

答案 0 :(得分:0)

我认为验证(和验证消息)不是数据处理的正确工具。整个代码应该已经存在于模型中。每个步骤也应该是一个单独的方法。根据具体情况,您可以使用RuntimeException或其他更好的匹配例外。

在执行处理的控制器/ shell中,您可以捕获它并闪烁错误消息:

try {
    $this->Model->processUploadedKmlFile($this->request->data);
} catch (\Execption $e) {
    $this->Session->setFlash($e->getMessage());
    // Redirect or do something else
}