文件上传是 CakePHP 没有开箱即用的事情,这是框架中唯一让我烦恼的事情之一。
我通过使用回调方法向模型添加文件处理来解决这个问题。我使用 上传实际文件beforeSave()
,并使用 .从文件系统中删除文件beforeDelete()
。示例模型如下所示:
<?php
App::uses('File', 'Utility');
class Image extends AppModel {
public $name = 'Image';
public function beforeSave($options = array()) {
$fieldName = 'filename';
$field = $this->data[$this->alias][$fieldName];
if (!is_array($field)) {
$this->validationErrors[$fieldName][] = 'No file detected';
return false;
}
switch ($field['error']) {
case UPLOAD_ERR_OK:
$newFilename = time() . '.jpg';
$uploadDir = WWW_ROOT . 'files/';
$source = $field['tmp_name'];
$destination = $uploadDir . $newFilename;
if (move_uploaded_file($source, $destination)) {
$this->data[$this->alias][$fieldName] = $newFilename;
return true;
}
else {
$this->validationErrors[$fieldName][] = 'No file detected';
return false;
}
break;
default:
$this->validationErrors[$fieldName][] = 'No file detected';
return false;
break;
}
}
public function beforeDelete($cascade = true) {
$image = $this->findById($this->id);
$file = new File(WWW_ROOT . 'files/' . $image['Image']['filename']);
return $file->delete();
}
}
显然这不是一个完美的实现,所以请随意借鉴、学习、调整。
这是最近为一个项目写的,其中只有一个模型附有图像,但在一个更大的项目中,我很可能将它包装成一个很好的模型行为。