Загрузка файла - это то, что 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();
}
}
Очевидно, что это не идеальные реализации, так что не стесняйтесь взять с него, учиться у него, адаптировать его.
Это было написано в манжете для проекта недавно, где есть только одна модель с прикрепленными изображениями, но в более крупном проекте я, скорее всего, завершу ее в приятное поведение модели.
Почему «APP. «Views''? Это не должно содержать загруженные данные. Используйте 'APP. «файлы» или «APP». «Webroot''. – mark