2013-05-31 7 views
0

Привет Я хочу, чтобы загрузить файл, используя торт PHP, я получил файл и я использую move_uploaded_file(), чтобы перейти к определенному местоположению, но не движется моя простая логика показано нижезагрузить файл в CakePHP

if (move_uploaded_file($this->data['Add']['upload']['tmp_name'], APP . 'views' . DS . 

    'static' . DS.'uploads'.DS.'Rajaram'.DS)) { 
       LogUtil::$logger->debug('KMP File upload Url : 
    '.var_export($this->data, true)); 
      } 

Thanks in Advance.

+0

Почему «APP. «Views''? Это не должно содержать загруженные данные. Используйте 'APP. «файлы» или «APP». «Webroot''. – mark

ответ

0

В модели вы можете использовать метод обратного вызова afterSave для обработки вашей загрузки файлов: -

public function afterSave($created) { 

    if (isset($_FILES['data']['name'][$this->alias]['filename'])) { 

     $filename = $_FILES['data']['name'][$this->alias]['filename']; 

     $fileInfo = pathinfo($filename); 
     $fileExt = isset($fileInfo['extension']) ? $fileInfo['extension'] : ''; 
     $filename = $fileInfo['filename']; 

     $newFilename = "$filename.$fileExt"; 

     $dir = WWW_ROOT . 'files' . DS . 'uploads'; 

     $target = $dir . DS . $newFilename; 

     move_uploaded_file($source, $target); 

    } 

} 

Вы можете использовать $ newFilename изменить имя файла, то подходящее в случае необходимости (я, как правило, чтобы проверить, если файл с тем же именем уже существует и переименовывает новый, чтобы не перезаписывать его.

1

Загрузка файла - это то, что 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(); 
    } 
} 

Очевидно, что это не идеальные реализации, так что не стесняйтесь взять с него, учиться у него, адаптировать его.

Это было написано в манжете для проекта недавно, где есть только одна модель с прикрепленными изображениями, но в более крупном проекте я, скорее всего, завершу ее в приятное поведение модели.

+0

На мой взгляд, они должны сделать это образцовым поведением. Это приведет к правильному балансу гибкости, не сдерживая. –

+0

Да, это была моя рекомендация. Выше было только то, что я использовал в проекте, где мне нужно было быстро добавить функциональность загрузки в модель. –

Смежные вопросы