2013-05-31 85 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)); 
      } 

在此先感謝。

+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

是的,那是我的建議。以上只是我在需要快速將上傳功能添加到模型的項目中使用的一些東西。 –