如何在CakePHP 3:上传多个图像到服务器并使用cakephp保存每个图像在数据库中3

问题描述:

我正在使用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

既然你想救你也必须创建多个实体在数据库中保存多个图像。使用您当前的控制器,您将创建一个实体并将数据保存到此实体。

在你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