2017-09-15 33 views
0

我正在使用cakephp 3在多個圖像文件上傳中,我希望這些圖像可以按目錄路徑我的代碼和每個上傳的圖像應保存在數據庫(我正在使用MySQL數據庫)。如何在CakePHP 3:上傳多個圖像到服務器並使用cakephp保存每個圖像在數據庫中3

在我目前的版本中,我可以在我的表單中選擇多個圖像,幸運的是,在提交我的表單後,所有圖像都成功上傳到服務器圖像目錄路徑,正如我所預料的那樣,只有一個圖像被保存在數據庫中,因爲它應該將所有圖像和每個圖像保存在數據庫中。

。由此代碼在我ImageUploadController副本:

public function add() 
{ 
    $UploadedImage = array(); 
    $uploadedImage = $this->UploadedImages->newEntity(); 

    if ($this->request->is('post')) { 

     $images = array(); 

     $images = $this->request->data['name']; 

     foreach ($images as $key => $image) { 

      if(!empty($image[$key].$image['name'])){ 
      $fileName = $image[$key].$image['name']; 
      $uploadPath = WWW_ROOT.'img/press-releases/'; 
      $uploadFile = $uploadPath.$fileName; 


      if(move_uploaded_file($image[$key].$image['tmp_name'],$uploadFile)){ 

       $uploadedImage->name = $fileName; 
       $uploadedImage->image_dir = 'press-releases/'; 
       $uploadedImage->status = $this->request->data['status']; 

       $this->UploadedImages->save($uploadedImage); 

      } else { $this->Flash->error(__('Unable to upload image, please try again.')); } 


      } else { $this->Flash->error(__('Please choose an image to upload.')); } 

     }//EOF FOREACH  

    } 

    $this->set(compact('uploadedImage')); 
    $this->set('_serialize', ['uploadedImage']); 
} 

這裏是我的簡單形式:add.ctp文件: simple multiple image upload form

這裏是我的模型表UploadImageTable:

class UploadedImagesTable extends Table 
{ 
    /** 
    * Initialize method 
    * 
    * @param array $config The configuration for the Table. 
    * @return void 
    */ 
    public function initialize(array $config) 
    { 
     parent::initialize($config); 

     $this->setTable('uploaded_images'); 
     $this->setDisplayField('name'); 
     $this->setPrimaryKey('id'); 

     $this->addBehavior('Timestamp'); 
    } 

    /** 
    * Default validation rules. 
    * 
    * @param \Cake\Validation\Validator $validator Validator instance. 
    * @return \Cake\Validation\Validator 
    */ 
    public function validationDefault(Validator $validator) 
    { 
     $validator 
      ->integer('id') 
      ->allowEmpty('id', 'create'); 

     $validator 
      ->allowEmpty('name'); 

     $validator 
      ->allowEmpty('image_dir'); 

     $validator 
      ->boolean('status') 
      ->allowEmpty('status'); 

     return $validator; 
    } 
} 

我是一個相當新的CakePHP 3,所以你們所有人都知道一些關於這個上傳多個圖像和保存每個圖像在一個數據庫中,請給我一隻手或者其他什麼東西可以幫我解決這個問題,因爲這個東西有點困難。任何您的幫助將不勝感激。

有關更多附加詳細信息,此處添加了我的調試器SQL日誌的屏幕截圖。 In the image,I tried to upload 5 images

如果你能看到圖像,因爲我試圖上傳5張圖片;首先查詢它對我的表執行INSERT,然後下一個其他查詢是UPDATE,這應該是INSERT。我想知道爲什麼DML(數據操作語言)在這樣的查詢中突然改變。

更由於事先 瑪麗

+0

感謝您的編輯建議..欣賞它。 – hotmarycorleone

+0

你可以使用我的插件或只是看看它。它正在做你正在嘗試的東西,但在更高的抽象層次上爲應用程序中的所有內容提供文件存儲,而不僅僅是圖像。 https://github.com/burzum/cakephp-file-storage閱讀文檔並隨時向IRC或Slack頻道提問。我必須承認這可能不是* newbie友好的,因爲它使用CakePHP事件系統,如果您不熟悉SoC,DRY和設計模式,可能總體上不容易理解。 – burzum

+0

您好burzum,我剛剛閱讀並試圖解決您的FileStorage插件一段時間,它的確很棒,但老實說,我認爲這需要我花些時間來理解它的工作原理,比如您的SoC的東西,新的cakephp,並仍在努力探索其核心。但我可以肯定地說,我會在其他時間使用你的。我非常感謝你的幫助。非常感謝。 – hotmarycorleone

回答

0

既然你想救你也必須創建多個實體在數據庫中保存多個圖像。使用您當前的控制器,您將創建一個實體並將數據保存到此實體。

在你UploadedImagesController嘗試以下操作:

public function add() 
{ 
    if ($this->request->is('post')) { 
     $data = $this->request->getData(); 

     $images = $data['name']; 
     $path = 'img/press-releases/'; 

     foreach ($images as $image) { 
      if(!empty($image['name'])) { 
       $fileName = $image['name']; 
       $uploadPath = WWW_ROOT . $path; 
       $uploadFile = $uploadPath . $fileName; 

       if(move_uploaded_file($image['tmp_name'], $uploadFile)) { 
        // Create a new Entity over here for each uploaded image 
        $uploadedImage = $this->UploadedImages->newEntity(); 
        $uploadedImage->name = $fileName; 
        $uploadedImage->image_dir = $path; 
        $uploadedImage->status = $data['status']; 

        $this->UploadedImages->save($uploadedImage) 
       } else { 
        $this->Flash->error(__('Unable to upload image, please try again.')); 
       } 
      } else { 
       $this->Flash->error(__('Please choose an image to upload.')); 
      } 
     } 
    } 

    $this->set(compact('uploadedImage')); 
    $this->set('_serialize', ['uploadedImage']); 
} 

您還可以通過直接saving multiple Entities解決這個問題。您可能還想將代碼外包給Model或Behavior以使其可在其他控制器中重用。就像burzum提到的那樣,使用file storage plugin來添加文件散列和/或唯一ID(如UUID)可能是明智的。否則,您可以上傳具有相同名稱的文件...

+0

我只能說「哇」和「謝謝」,你的代碼就像一個魅力蜂蜜,我非常高興。我只是複製了代碼並替換了我的整個ADD函數,並在(我猜你剛剛忘了)之後添加了一些分號「$ this-> UploadedImages-> save($ uploadedImage)」,它起作用。非常感謝。 – hotmarycorleone

相關問題