Erreur inconnue avec move_uploaded_file()

Evenkore Messages postés 18 Statut Membre -  
 Utilisateur anonyme -
Plop :D

Alors voilà, je voudrais créer un système d'avatars pour mon site. Sauf que voilà, move_uploaded_file() me retourne FALSE dans tous les cas, et je ne vois absolument pas pourquoi :/

Voici mon code :

if (isset($_FILES['avatar'])) {
	$ds = $_SERVER['DOCUMENT_ROOT'] .'/images/avatars/';
	$ext = array('.png', '.gif', '.jpg', '.jpeg');
	$exd = strrchr($_FILES['avatar']['name'], '.');
	$fc = basename($_FILES['avatar']['name']);
	if (!in_array($exd, $ext)) {
		header('Location: account.php?al=bf');
	} else {
		$ms = 40000;
		$sz = filesize($_FILES['avatar']['tmp_name']);
		if ($sz > $ms) {
			header('Location: account.php?al=tl');
		} else {
			$fc = strtr($fc, 
          			'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
         			'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    			$fc = preg_replace('/([^.a-z0-9]+)/i', '-', $fc);
    			if(move_uploaded_file($_FILES['avatar']['tmp_name'], $ds . $fc))
     			{
     				$upd = $bdd->prepare('UPDATE membres SET avatar = ? WHERE id = ?');
     				$upd->execute(array('/images/avatars/'.$fc, $_SESSION['id']));
          			header('Location: account.php?al=dc');
     			} else {
     				header('Location: account.php?al=errav');
     			}
		}
	}
}


Help siouplait? :(

15 réponses

  1. Utilisateur anonyme
     
    Tu dis que $_SERVER['DOCUMENT_ROOT'] (je suppose que c'est la variable globale dont tu parles dans ton message #4) te rend "/" et que la racine de ton site, ce n'est pas la racine du disque.
    N'y aurait-il pas comme une contradiction ?
    1
    1. Utilisateur anonyme
       
      Je viens de me créer un compte chez Olympe.in et je constate qu'effectivement, $_SERVER['DOCUMENT_ROOT'] donne bien "/" ce qui ne reflète certainement pas le dossier réel racine du site.
      On doit pouvoir trouver le 'vrai' document_root à partir de __FILE, mais c'est gênant pour la compatibilité avec les scripts 'normaux'
      0
    2. Utilisateur anonyme
       
      Après essais, si tu mets dans un fichier situé à la racine de ton site (et que tu inclus ce fichier dès le début de tes scripts ! ) :
      define ('DOCUMENT_ROOT', pathinfo(__FILE__,PATHINFO_DIRNAME ));

      Tu peux utiliser DOCUMENT_ROOT à la place du $_SERVER['DOCUMENT_ROOT'] habituel de PHP. Attention, le chemin obtenu ne se termine PAS par un "/".
      J'ai choisi "define" pour avoir une constante plutôt que de définir une variable $document_root=... car avec une constante, tu n'as pas besoin de mettre global dans toutes les fonctions. Par contre, tu ne peux pas mettre la constante dans une chaîne entre doubles quotes, à toi de voir ce que tu préfères.
      0
    3. Utilisateur anonyme
       
      En fait, je me complique pour rien. Il suffit de faire
      define ('DOCUMENT_ROOT', __DIR__);
      0
  2. Utilisateur anonyme
     
    Bonjour

    As-tu testé $_FILES['avatar']['error'] ?
    As-tu fait afficher $ds . $fc pour être bien sûr du nom de destination ?
    0
  3. Evenkore Messages postés 18 Statut Membre
     
    Le premier renvoie 0, et le deuxième /images/avatars/avatar_1.png, soit le bon chemin...
    0
  4. Utilisateur anonyme
     
    /images/avatars/avatar_1.png, soit le bon chemin...
    Je me permets (peut-être à tort) d'en douter.

    /images est vraiment un répertoire à la racine de ton disque ? Ou à celle de ton site ? Si c'est bien à la racine du disque courant, ok, mais si c'est à la racine de ton site, tu aurais plutôt dû faire :
    move_uploaded_file($_FILES['avatar']['tmp_name'], $_SERVER['DOCUMENT_ROOT ] . $ds . $fc)


    Car ici, il n'est pas question d'URL, mais de système de fichiers. Donc un chemin qui commence par / est un chemin absolu dans le système de fichiers, pas dans le dossier de ton site.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Evenkore Messages postés 18 Statut Membre
     
    Je sais tout ça, mais la variable globale (qui est déjà dans mon code, d'ailleurs) renvoie "/" ...
    0
  7. Utilisateur anonyme
     
    En effet, excuse-moi, j'avais lu trop vite.
    As-tu essayé d'afficher $_FILES['avatar']['tmp_name'] et $sz pour voir s'ils semblent corrects ?
    0
    1. Utilisateur anonyme
       
      Remarque : tu dis que la variable globale te renvoie "/"
      Dans ce cas, d'après ton code, $ds.$fc devrait t'afficher //images/avatars/avatar_1.png, et non pas simplement /images/avatars/avatar_1.png.
      0
    2. Evenkore Messages postés 18 Statut Membre
       
      Oui oui, j'ai enlevé le "/" dans "/images" quand j'ai remarqué ça.
      0
  8. Utilisateur anonyme
     
    Et qu'en est-il de $_FILES['avatar']['tmp_name'] et $sz ?
    0
  9. Evenkore Messages postés 18 Statut Membre
     
    Retour : /tmp/phpK2Bdzl et 36880 (correct)
    0
  10. Utilisateur anonyme
     
    J'ose à peine le demander ... tu as bien vérifié l'existence et les droits de lecture/écriture du répertoire /images/avatars/ ? As-tu essayé de créer un fichier dans ce répertoire, avec un script, en faisant un simple fopen ?
    0
  11. Evenkore Messages postés 18 Statut Membre
     
    /images/avatars/ : je l'ai moi même créé dans mon FTP avec le CHMOD 755.
    Et non j'ai pas essayé.
    0
  12. Utilisateur anonyme
     
    Tu l'as créé dans ton FTP ? C'est sur un serveur distant ? Alors la racine de ton site, c'est la racine du disque de ton serveur ? Je me pose de plus en plus de questions.
    0
  13. Evenkore Messages postés 18 Statut Membre
     
    Oui, oui, non (cf. doc d'Olympe.in)
    0
  14. Evenkore Messages postés 18 Statut Membre
     
    Fichier placé à la racine du site, include fait, mais toujours ce / désespérant... :/
    0
  15. Utilisateur anonyme
     
    Pourrais-tu faire des phrases complètes et explicites ?
    Si tu utilises bien DOCUMENT_ROOT à la place de $_SERVER['DOCUMENT_ROOT'], tu dois maintenant avoir un nom de chemin un peu plus élaboré qu'un simple '/'.
    J'ai bien dit DOCUMENT_ROOT tout court, sans $_SERVER['']
    0
  16. Evenkore Messages postés 18 Statut Membre
     
    Oh, ça marche \o/

    Merci beaucoup ;)
    0
    1. Utilisateur anonyme
       
      De rien :-)
      0