Bug move_uploaded_file

Par lakamark, il y a 11 ans


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

Grafikart, il y a 11 ans

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

Inspirat, il y a 11 ans

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, il y a 11 ans

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); }
Inspirat, il y a 11 ans

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');
zil, il y a 11 ans

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ù

snap, il y a 11 ans

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.

zil, il y a 11 ans

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

lakamark, il y a 11 ans

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

zil, il y a 11 ans

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

lakamark, il y a 11 ans

C'est vrais et logique.

Inspirat, il y a 11 ans

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, il y a 11 ans

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

Merci