2017-09-15 2 views
0

Je travaille sur plusieurs téléchargements de fichiers image en utilisant cakephp 3, où, je veux que ces images soient téléchargées dans le serveur comme spécifié dans le chemin du répertoire de mon code et, chaque image téléchargée doit être enregistrée dans la base de données (j'utilise la base de données MySQL).Comment dans CakePHP 3: Télécharger plusieurs images sur le serveur et enregistrer chaque image dans la base de données en utilisant cakephp 3

Sur ma version actuelle, je peux sélectionner plusieurs images dans mon formulaire, heureusement, après avoir envoyé mon formulaire, toutes les images sont téléchargées avec succès dans le répertoire image du serveur comme je l'espérais. dans la base de données, car il devrait enregistrer toutes et chacune des images dans la base de données.

Ci-joint une copie du code dans mon 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']); 
} 

Et voici ma forme simple: fichier add.ctp: simple multiple image upload form

Et voici ma table modèle 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; 
    } 
} 

Je suis assez nouveau CakePHP 3, donc vous tous les gars qui savaient quelque chose à propos de cela télécharger plusieurs images et enregistrer chaque image s dans une base de données, s'il vous plaît donnez-moi un coup de main ou quelque chose pourrait m'aider à sortir de ça, parce que je suis un peu coincé dans cette chose. Toute aide de votre part sera grandement appréciée.

Pour plus de détails, j'ai ajouté ci-joint une capture d'écran de mes journaux SQL du débogueur. In the image,I tried to upload 5 images

si vous pouvez voir l'image, que j'ai essayé de télécharger 5 images; à la première requête, il exécute un INSERT sur ma table, puis les autres requêtes suivantes sont UPDATE, ce qui devrait être INSERT. Je me demande pourquoi le langage DML (Data Manipulation Language) change soudainement dans de telles requêtes.

plus grâce à l'avance, Mary

+0

merci pour cette proposition d'édition .. l'apprécier. – hotmarycorleone

+0

Vous pouvez utiliser mon plugin ou simplement le regarder. C'est exactement ce que vous essayez de faire, mais à un niveau d'abstraction plus élevé pour fournir un stockage de fichiers pour tout ce qui est dans votre application, pas seulement des images. https://github.com/burzum/cakephp-file-storage Lisez la documentation et n'hésitez pas à poser des questions sur IRC ou le canal Slack. Je dois admettre que ce n'est probablement pas un bon début pour les débutants, car il utilise le système d'événements CakePHP et pourrait ne pas être facile à comprendre si vous n'êtes pas familier avec les modèles SoC, DRY et design. – burzum

+0

Bonjour Burzum, je viens de lire et j'ai essayé de travailler pendant un moment sur votre plugin FileStorage et c'est vraiment incroyable, mais honnêtement, je pense que ça me prendrait vraiment un jour de comprendre comment ça fonctionne, comme le truc de votre SoC nouveau dans cakephp et toujours essayer d'explorer son noyau.Mais tout ce que je peux dire à coup sûr que je vais utiliser le vôtre dans un autre temps.J'apprécie vraiment votre aide. Merci beaucoup. – hotmarycorleone

Répondre

0

Puisque vous souhaitez enregistrer plusieurs images que vous avez aussi créer plusieurs entités pour enregistrer dans votre base de données. Avec votre contrôleur actuel, vous créez une entité unique et sauvegardez les données dans cette entité.

Dans votre UploadedImagesController les opérations suivantes:

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']); 
} 

Vous pouvez résoudre ce problème aussi par saving multiple Entities directement. Vous pouvez également vouloir externaliser votre code à un modèle ou un Behavior pour le rendre réutilisable dans d'autres contrôleurs. Comme burzum mentionné il pourrait être sage d'utiliser un file storage plugin pour ajouter des choses comme le hachage de fichier et/ou des ID uniques (par exemple, UUID). Sinon, vous pouvez télécharger des fichiers avec le même nom ...

+0

Tout ce que je peux dire est "Wow" et "Merci" votre code fonctionne comme un charme de miel, je suis tellement très heureux. Je viens de copier le code et de remplacer toute la fonction ADD dans la mienne et ajouté un point-virgule après (je suppose que vous avez juste oublié) "$ this-> UploadedImages-> save ($ uploadedImage)" et cela fonctionne. Merci beaucoup. – hotmarycorleone