Bonjour à tous,
Je voudrais pouvoir transferer une image, dans un sous dossier sous webroot/img/photos .
au niveau de la base de données l'enregistrement s'est fait, mais au niveau de l'upload aucune image ne peut etre transferé.

c'est pour celà j'ai cré une vue add.ctp

<?php echo $this->Form->create('Post', array('type' => 'file')); ?>
<?php echo $this->Form->input('titre', array('class' => 'class=form-control')); ?>
<?php echo $this->Form->input('contenu'); ?>
<?php echo $this->Form->input('photo_file',array('label'=>'votre format jpg ou png ','type'=>'file')); ?>
<?php echo $this->Form->end('Ajouter'); ?>

et pour l'action add

 public function add()  
 if(!empty($this->request->data)){
        $this->Post->save($this->request->data);
        $filename = $this->request->data['Post']['photo_file']['name'];
        $extention=pathinfo($filename, PATHINFO_EXTENSION);

        if(!empty($this->request->data['Post']['photo_file']['tmp_name']) &&
          in_array($extention, array('png','jpg','jpeg'))
          )
        {
          move_uploaded_file($this->request->data['Post']['photo_file']['tmp_name'],
           IMAGES .'photos' . DS . $this->Post->id . '.' . $extention);
                 }
      }
    }

8 réponses


Lartak
Réponse acceptée

Pourquoi les deux request data de fichiers ont un nom différent (photo et photo-file) ?
Si tu as un problème pour l'upload, c'est peut-être parce que tu te trompe dans le nom du fichier.
En plus de ça, dans ton formulaire il est défini autrement, ce qui ferait trois noms pour le même champ :

  • photo
  • photo-file
  • photo_file

Aucune erreur levée ? Un message dans les logs ?
Est-ce que IMAGES .'photos' . DS est un chemin valide ?
La condition de ton if(!empty(...)) est-elle vérifier ? (En gros, est-ce que tu arrives jusqu'à l'appel du move_uploaded_file ?)

Quel est le contenu de $this->request->data['Post']['photo_file'] ?

Hello,

Petit plus lors de ta vérification, tu ne vérifie pas le type mime, tu devrais.

A +

Bonjour.
Pour information, la constante IMAGES est obsolète, utilises plutôt la constante WEBROOT_DIR pour tomber à coup sur dans le répertoire webroot.
Source : Définitions des constantes du noyau.
Il te faut donc faire :

WEBROOT_DIR . DS . 'img' . DS . $this->Post->id . '.' $extension

Par contre vérifies si la constante WEBROOT_DIR si elle n'inclue pas le directory separator après son nom, car je ne sais plus trop.

Je ne sais pas si tu le fais, mais si ce n'est pas le cas, je te conseille de faire la vérification via la validation du modèle concernant l'extension et la taille de l'image.
Ce qui t'évitera des manipulations au niveau du controller pour faire ses vérifications.
Ensuite, je ne sais pas si c'est une erreur lors de ta recopie de code, mais contrôle que tu n'aies pas oublié l'ouverture de l’accolade de la fonction.

Merci boucaup à tous,
Oui c'est vrai Mr Lartak, c'etait une erreur de copie de code,
mais ce que j'ai remarqué apres avoir tenté d'uploader l'image, comme je vous ai dit le stock au niveau de la base se fait avec success, mais à coté du label de parcourir il apparait ce message "aucun fichier selectionné ".

il apparait ce message "aucun fichier selectionné "

C'est normal, c'est ce qui est affiché lorsque aucune image n'a pas encore été sélectionné par l'utilisateur et lorsque tu valides le formulaire, le champ se vide automatiquement et ne peux pas être re rempli contrairement aux autres champs qui ne sont pas de type file.

Mais ce qui est bizare : lorsque je debeug $this->request->data['Post']['photo']['tmp_name']

$extention=pathinfo($filename, PATHINFO_EXTENSION);
        debug("premeir debeug ".$this->request->data['Post']['photo']['tmp_name']);

        if(!empty($this->request->data['Post']['photo-file']['tmp_name']) )
        {

il m'affiche 'premeir debeug C:\wamp\tmp\phpB222.tmp'
cela veut dire que l'image à été bien chargé dans le tmp. n'est ce pas?

Merci Mr Lartak pour votre interaction.