我有一个用于在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中可能没有任何有用的数据。
这样做高级文件验证的“正确”方法是什么?我可以将一些逻辑放入自定义验证器函数中,但之后我必须复制大量代码,解压缩文件两次,等等。
答案 0 :(得分:0)
我认为验证(和验证消息)不是数据处理的正确工具。整个代码应该已经存在于模型中。每个步骤也应该是一个单独的方法。根据具体情况,您可以使用RuntimeException
或其他更好的匹配例外。
在执行处理的控制器/ shell中,您可以捕获它并闪烁错误消息:
try {
$this->Model->processUploadedKmlFile($this->request->data);
} catch (\Execption $e) {
$this->Session->setFlash($e->getMessage());
// Redirect or do something else
}