Bonjour,
Je suis entraine de développer un site web. Les gens pourrons personaliser leur page de profil avec des images qui pourons téléversé.

Je me suis fait un uploader type "plupload" (Glisser déposer). Les requête seront envoyer en ajax. Pour tester l'enregistrement en base de donné je me suis fait un formulaire quand je fait enregistré il y a cette erreur qui s'affiche :
Warning (2): move_uploaded_file(/img/uploads/users/backgrounds/1/IMG_0013.JPG.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory [APP/Model/Background.php, line 69]

Voici la fonction de mon model background.php

public function afterSave($created, $options = array()) {
        if (isset($this->data[$this->alias]['background_file'])) {
            $file = $this->data[$this->alias]['background_file'];
            $extention = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
            if (!empty($file['tmp_name'])) {
                $destination = '/img'.DS.'uploads'.DS.'users'.DS.'backgrounds'.DS.AuthComponent::user('id').DS.$file['name'].'.'.$extention;
                debug($destination);

                debug(move_uploaded_file($file['tmp_name'], $destination));
                $this->savefield("background",$destination);
            }
        }
    }

Merci.

12 réponses


Inspirat
Réponse acceptée

Hum... Il est ajouté après la vérification de l'existence du dossier le nom et l'extension Zil ;)

$destination = IMAGES . 'uploads' . DS . 'users' . DS . 'backgrounds' . DS . AuthComponent::user('id');
if(!file_exists($destination)){
      mkdir($destination, 0777, true);
}
$destination .= DS.$file['name'] . '.' . $extention;
move_uploaded_file($file['tmp_name'], $destination);

Ca ne fonctionne toujours pas avec la constante "IMAGES" ?

lakamark
Auteur
Réponse acceptée

Désolé, de mon retard. Ça fonctionne avec la constante "IMAGES"

Merci

Le dossier qui va recevoir l'avatar existe ?
Tu devrais rajouter une condition avant pour créer le dossier si il n'existe pas

Effectivement, dans ce cas le dossier n'existe pas, il est donc nécessaire de vérifier avant et de le créer s'il n'existe pas, pour ça rien de bien compliqué:

$destination = '/img'.DS.'uploads'.DS.'users'.DS.'backgrounds'.DS.AuthComponent::user('id');
if(!file_exists($destination)){
      mkdir($dest, 0777, true);
}
$destination .= DS.$file['name'].'.'.$extention;
move_uploaded_file($file['tmp_name'], $destination);
lakamark
Auteur

Il veut même pas créer le dossier quand je vérifie l'existance du dossier.

if(!file_exists($destination)){
      mkdir($destination, 0777, true);
}

Et avec la constante du dossier d'image ? Car théoriquement ça ne pointe pas au bon endroit dans ton cas...

$destination = IMAGES . 'uploads' . DS . 'users' . DS . 'backgrounds' . DS . AuthComponent::user('id');

Salut
debug($destination) pour commencer, voir si ça pointe bien là où tu veux
puis vérifie les droits de ce dossier, au cas où

Le chemin de destination qui commence par /img ça sent pas très bon. Inspirat à raison, utilise la constante IMAGES ou bien WWW_ROOT qui dirige vers vers le webroot.

Oui, tu peux faire un debug(get_defined_constants()); pour voir tous les chemins de tes constantes, tout en bas de la liste

lakamark
Auteur

Est-ce que je devait appeler les fichiers 1.png ou name.png.?

Pour le moment le nom de l'image c'est 1 puisque tu as mis AuthComponent::user('id')
faudrait rajouter un .png

lakamark
Auteur

C'est vrais et logique.