Fonction move_uploaded_file() ne fonctionne pas

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Fonction move_uploaded_file() ne fonctionne pas

Re: Fonction move_uploaded_file() ne fonctionne pas

par xTG » 17 févr. 2012, 18:47

J'ai un problème sur mon code. QUand je charge le fichier je charge un .txt. alors que j avais insérer un .jpg...
Tu aurais du créer ton propre topic.
De plus sans informations ou boule de cristal cela va être dur de te répondre...
C'est comme demander à un aveugle de quelle couleur est la peinture dans le pot.

Re: Fonction move_uploaded_file() ne fonctionne pas

par moi^^ » 17 févr. 2012, 18:42

J'ai un problème sur mon code. QUand je charge le fichier je charge un .txt. alors que j avais insérer un .jpg...

Re: Fonction move_uploaded_file() ne fonctionne pas

par Micky » 16 août 2010, 15:34

Merci, je vais regarder tout ça. :wink:

Re: Fonction move_uploaded_file() ne fonctionne pas

par AB » 16 août 2010, 13:46

Si tu veux te servir de la classe, je te donne le même exemple avec enregistrement du résultat dans une bdd en reprenant tes données :
<?php require('class_upload.php');

//pour exemple $_SESSION['id'] = 'toto';
session_start();$_SESSION['id'] = 'toto';
 

$up = new Telechargement('avatars','form1','photo','get_form');

$up->Set_Nomme_fichier($_SESSION['id'],'ext_fichier_telecharge');

$up->Set_Redim('100','100');

$up->Upload();

// Récupération du tableau des résultats
$transfert = $up->Get_Tab_upload ();

if (!empty ($transfert))
     {
	$result = $transfert['resultat'];//tableau à trois dimensions  
	   
	foreach ($result as $num => $rep)
		{
		foreach ($rep as $key => $value)
			{                                                          
				if(!empty($value['nom']))                                  
										
					{
						$req = $bdd->prepare('UPDATE membres SET avatar = :avatar WHERE id = :id');
						$req->execute(array('avatar' => $value['nom'], 'id' => $_SESSION['id']));
						$req->closeCursor();
					}
			}    
		}
		
	$up->Get_Reload_page();
} 

// tableau des messages
$resultat = $up->Get_Tab_message();
?>
<form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?get_form=1'?>" method = "post"> 
     
<input type = "hidden" name = "MAX_FILE_SIZE"  value = "<?php echo isset($up)? $up->Return_Octets('20K') : ''?>" />

<input name = "photo" type = "file" size = "70" />       
                          
<input type = "submit" name = "form1" value = "Envoyez"  />    

</form>

<?php
        if (!empty($resultat))
                        {
                                echo '<p>';
                                        foreach ($resultat as $num)
                                                {
                                                        foreach ($num as $value)
                                                        echo htmlspecialchars($value).'<br />';
                                                }
                                echo '</p>';
                        }
?>
Le double foreach paraît un peu compliqué mais ça permet de garder la même syntaxe pour récupérer les résultats quelque soit le nombre de champs et de répertoires de destination. Cela reprend en fait l'exemple numéro 2 de ce message mais simplifié puisque tu n'as qu'un champ de fichier et un seul répertoire de destination.

Re: Fonction move_uploaded_file() ne fonctionne pas

par Micky » 16 août 2010, 12:14

Hum… ça marche.

Merci beaucoup ; je vais voir si je trouve ce qui ne va pas dans mon code, sinon j’utiliserai ta classe (très complète). ;)

Merci encore et bonne journée !

Re: Fonction move_uploaded_file() ne fonctionne pas

par AB » 16 août 2010, 04:01

Il faut peut-être des configurations spéciales, dans le php.ini ou pour la fonction move_uploaded_file ?
non.
T'as essayé la classe que je t'ai donnée plus haut en lien ?

En regardant ton code, d'après ce que je crois comprendre le redimensionnement en 100*100 et le téléchargement pourrait donner un code comme ceci :
<?php require('class_upload.php');

//pour exemple $_SESSION['id'] = 'toto';
session_start();$_SESSION['id'] = 'toto';
 

$up = new Telechargement('avatars','form1','photo','get_form');

$up->Set_Nomme_fichier($_SESSION['id'],'ext_fichier_telecharge');

$up->Set_Redim('100','100');

$up->Upload('reload');

$resultat = $up->Get_Tab_message();
?>
<form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?get_form=1'?>" method = "post"> 
     
<input type = "hidden" name = "MAX_FILE_SIZE"  value = "<?php echo isset($up)? $up->Return_Octets('20K') : ''?>" />

<input name = "photo" type = "file" size = "70" />       
                          
<input type = "submit" name = "form1" value = "Envoyez"  />    

</form>

<?php
        if (!empty($resultat))
                        {
                                echo '<p>';
                                        foreach ($resultat as $num)
                                                {
                                                        foreach ($num as $value)
                                                        echo htmlspecialchars($value).'<br />';
                                                }
                                echo '</p>';
                        }
?>
Déjà tu pourrais essayer ce code dans une page séparée comme ça tu pourrais voir si ça fonctionne et les éventuels messages d'erreurs. Le code ci-dessus suppose que ton dossier 'avatars' est situé à la racine de ton site.

Pour que ça fonctionne il faut bien entendu copier le code de cette classe (situé un peu avant la fin du message du lien ci-contre) et le mettre dans un fichier nommé "class_upload.php" puisque je fais en première ligne : require('class_upload.php')

Re: Fonction move_uploaded_file() ne fonctionne pas

par Invité » 15 août 2010, 20:53

J’ai vérifié, le dossier « avatars » existe et j’ai les droits d’écriture, donc je ne vois vraiment pas où ça pourrait bloquer… Peut-être que le chemin temporaire du fichier téléchargé n’est pas le bon ? Mais je ne vois pas pourquoi il ne serait pas correct.

Il faut peut-être des configurations spéciales, dans le php.ini ou pour la fonction move_uploaded_file ?

Re: Fonction move_uploaded_file() ne fonctionne pas

par AB » 11 août 2010, 22:02

dev3 t'a donné les principales pistes.

Sinon pour info, comme j'en avais marre de répondre à ces problèmes d'upload qui sont parfois difficiles à résoudre, j'ai fait une classe de téléchargement avec gestion des erreurs et redimensionnement que tu peux trouver ici. Le premier message contient la classe et son mode d'emploi et le second message des exemples d'utilisations. A défaut si tu ne veux pas utiliser cette classe tu peux toujours t'inspirer du code :wink:

Re: Fonction move_uploaded_file() ne fonctionne pas

par dev3 » 11 août 2010, 16:05

Bonjour,

Dans un premier temps mets ta redirection à la fin de ton code en commentaire et assures toi que ton niveau d'affichage d'erreur et de warning est au maximum.
Ré-execute ton script pour voir les erreurs qui ressortent.

Les erreurs courantes sont:
- mauvais chemin de destination
- droit d'ecriture du dossier
...

Fonction move_uploaded_file() ne fonctionne pas

par Micky » 11 août 2010, 15:00

Bonjour,

J’aurais besoin de votre aide car je bloque sur un petit problème : j’ai écrit un petit script comprenant un formulaire qui envoie une image (appelons-la « avatar »), et j’aimerais bien pouvoir l’enregistrer sur le serveur (enfin, sur mon disque dur en local).

Tout se passe bien jusqu’au moment d’utiliser la fonction move_uploaded_file() ; celle-ci ne renvoie pas d’erreur, juste « false », et l’image n’est donc pas déplacée dans le dossier désiré.

Je ne sais pas ce qui est faux, le php.ini a l’air en ordre et les paramètres envoyés à la fonction semblent corrects également…

Bref, je suis un peu perdu. Je vous mets le code qui nous intéresse (le tableau de session est utile pour le reste du code, c’est pourquoi je n’ai pas mis qu’une simple variable) :
<?php
if (isset($_GET['modifier']))
{
	?>
	<form method="post" action="profil.php"  enctype="multipart/form-data">
		<label for="avatar">Changer mon avatar :</label>
		<input type="file" name="avatar" id="avatar" />
		<input type="submit" value="Modifier mon profil" />
	</form>
	<?php
}

if (isset($_FILES['avatar']) AND $_FILES['avatar']['error'] == 0)
{
	if ($_FILES['avatar']['size'] <= 200000)
	{
		$fichier = pathinfo($_FILES['avatar']['name']);
		$extension = $fichier['extension'];
		$extensionsAutorisees = array('jpg', 'jpeg', 'gif', 'png');
		if (in_array($extension, $extensionsAutorisees))
		{
			$nom = $_SESSION['id'] . '.' . $extension;
			if (move_uploaded_file($_FILES['avatar']['tmp_name'], 'avatars/' . $nom))
			{
				$req = $bdd->prepare('UPDATE membres SET avatar = :avatar WHERE id = :id');
				$req->execute(array('avatar' => $nom, 'id' => $_SESSION['id']));
				$req->closeCursor();
				$image = ($extension == 'jpg' OR $extension == 'jpeg') ? imagecreatefromjpeg('avatars/' . $nom) : (($extension == 'gif') ? imagecreatefromgif('avatars/' . $nom) : imagecreatefrompng('avatars/' . $nom));
				$largeurImage = imagesx($image);
				$hauteurImage = imagesy($image);
				if ($largeurImage > 100 OR $hauteurImage > 100)
				{
					$reduction = max($largeurImage / 100, $hauteurImage / 100);
					$avatar = imagecreatetruecolor(round($largeurImage / $reduction), round($hauteurImage / $reduction));
					$largeurAvatar = imagesx($avatar);
					$hauteurAvatar = imagesy($avatar);
					imagecopyresampled($avatar, $image, 0, 0, 0, 0, $largeurAvatar, $hauteurAvatar, $largeurImage, $hauteurImage);
					if ($extension == 'jpg' OR $extension == 'jpeg')
						imagejpeg($avatar, 'avatars/' . $nom);
					else if ($extension == 'gif')
						imagegif($avatar, 'avatars/' . $nom);
					else
						imagepng($avatar, 'avatars/' . $nom);
				}
			}
			else
				$_SESSION['erreurs'][] = 'L\'image n\'a pas pu être chargée.';
		}
		else
			$_SESSION['erreurs'][] = 'L\'extension de cette image n\'est pas autorisée.';
	}
	else
		$_SESSION['erreurs'][] = 'La taille de l\'image est trop importante. Elle ne doit pas dépasser 200000 octets.';
}
if (isset($_SESSION['erreurs']))
	header('Location: profil.php?modifier');
?>
Je suis redirigé vers la modification du « profil », avec mon message d’erreur personnalisé (« l’image n’a pas pu être chargée ») qui s’affiche.
Je n’ai pas pu tester la suite du code, après la fonction move_uploaded_file(), mais si quelque chose est faux, n’hésitez pas à me le signaler. ;)

Comme vous vous en doutez, aucune image n’est créée dans mon dossier. Ça m’embête.
Si vous voyez le problème ou que vous avez besoin de plus d’informations, n’hésitez pas à me le dire. :)

Merci d’avance pour vos réponses !
Cordialement.