Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/01/2014, à 22:56

gringo75

[Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Bonjour à tous,

Je poste ce message car je poursuis actuellement un tutoriel sur PHP et je suis sur la partie upload de fichiers via un formulaire; Je fais tout pour le moment en local et mes questions tournent autour du point suivant :
Comment uploader un fichier en PHP à partir du répertoire temporaire vers un répertoire définitif dans mon dossier var/www?

Remarque : j'ai créé 2 fichiers dans www  :
1er fichier : fichier du formulaire de téléchargement du fichier (une image dans mon cas) appelé envoi.php :
<!DOCTYPE html>
<html>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<body>
    <form action="cible_envoi.php" method="post" enctype="multipart/form-data">
        <p>Formulaire d'envoi de fichier :</br>
        <input type="file" name="monfichier" /><br/>
        <input type="submit" value="Envoyer le fichier" />
        </p>

    </form>    </body>
</html>

2ème fichier : fichier de réception que j'ai appelé cible_envoi.php :
<!DOCTYPE>

<html>

        <title>Test upload</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<body>
   
<?php
// Testons si le fichier a bien été envoyé et s'il n'y a pas d'erreur
if (isset($_FILES['monfichier']) AND $_FILES['monfichier']['error'] == 0)
{
        //Testons si le fichier n'est pas trop gros
        if ($_FILES['monfichier']['size'] <= 1000000)
        {
                 //Testons si l'extension est autorisée
                $infosfichier = pathinfo($_FILES['monfichier']['name']);
                $extension_upload = $infosfichier['extension'];
                $extensions_autorisees = array('jpg', 'jpeg', 'gif', 'png');
                if (in_array($extension_upload, $extensions_autorisees))
                {
                         //On peut valider le fichier et le stocker définitivement
                        move_uploaded_file($_FILES['monfichier']['tmp_name'], '/var/www/uploads' . basename($_FILES['monfichier']['name']));
                        echo "L'envoi a bien été effectué !";
                }
        }
}
?>

- Mes questions :
De ce que j'ai lu sur de nombreux tutos, je dois indiquer le chemin où je veux installer mon fichier uploadé, j'ai donc mis /var/www/uploads dans mon code dans cible_envoi.php comme surligné en rouge ci-dessus et j'ai fait un chmod 777 sur le dossier uploads que j'ai créé dans www préalablement MAIS pourtant j'ai 2 problèmes :
1- Je n'ai pas le message "L'envoi a bien été effectué !", mais une page blanche quand "j'uploade" le formulaire et que je passe de la page envoi.php à la page cible_envoi.php, ce qui veut sans doute dire qu'il y'a un problème mais je ne vois pas ce qui cloche dans mon code ?
2- Si j'ai bien compris, si tout marche bien, je devrais avoir mon image qui se stocke dans le répertoire uploads, or je n'ai rien du tout ?

Pourriez-vous m'aider sur ces 2 points car malgré toutes mes recherches, je n'arrive pas à avancer et j'ai l'impression qu'il y'a juste un petit truc à voir .

Merci d'avance pour votre aide.
Bonne soirée

Dernière modification par gringo75 (Le 25/02/2014, à 23:09)

Hors ligne

#2 Le 09/01/2014, à 23:22

J5012

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

ici : http://php.net/manual/fr/features.file- … method.php , le bloc d'execution pour l'upload est englobe dans 2 echo : <pre> et </pre> , qui sont des balises de pre-formatage html : afficher tel quel le texte suivant (reference aux textes affiches par les echo internes au bloc ?)

Hors ligne

#3 Le 10/01/2014, à 00:42

compte supprimé x0

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Salut,

Commence par virer tous les tests, pour voir si ton fichier arrive bien là où il faut.
Si oui, il y a un problème dans les tests
Si non, il y a un autre problème (les droits ?).

Dernière modification par Dr. Hugo Z. Hackenbush (Le 10/01/2014, à 00:53)

#4 Le 10/01/2014, à 01:00

compte supprimé x0

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

J5012 a écrit :

ici : http://php.net/manual/fr/features.file- … method.php , le bloc d'execution pour l'upload est englobe dans 2 echo : <pre> et </pre> , qui sont des balises de pre-formatage html : afficher tel quel le texte suivant (reference aux textes affiches par les echo internes au bloc ?)

<pre> c'est en gros l'équivalent de la balise code d'ici.
Ça n'explique pas que le fichier image n'arrive pas à destination.

#5 Le 10/01/2014, à 22:01

gringo75

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Bonsoir à tous,

Merci à Dr. Hugo Z. Hackenbush et J5012 pour vos réponses;
J'ai enlevé tous les tests du docteur (lol) mais cela ne marche pas.
1) J'ai enlevré tous les tests pour ne garder que ce code dans cible_envoi.php :
<!DOCTYPE>
<html>
        <title>Test en cours</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<body>   
<?php
                        move_uploaded_file($_FILES['monfichier']['tmp_name'], '/var/wwww/Tests/uploads' . basename($_FILES['monfichier']['name']));
                        echo "L'envoi a bien été effectué !";
?>

=>Rien ne s'affiche dans la page cible_envoi.php sur laquelle je suis renvoyé quand j'uploade le fichier dans envoi.php

2) Pour les droits, pour être sûr de ne pas me rater, j'ai fait un chmod 777 pour uploads mais également pour Tests (le dossier dans www) en ligne de commande.
=>Toujours le même problème : page blanche.

Je me demande si ce n'est pas la façon d'écrire le chemin du répertoire de destination qui pose problème ?

Merci de votre aide.

Hors ligne

#6 Le 11/01/2014, à 10:18

bruno

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Tu devrais effectivement utiliser un chemin relatif pour le fichier de destination. Il y a un problème avec le chemin complet+ basename($ton_fichier) qui créée un chemin non valable (voir la fonction basename)
Sinon tu peux tester avec :

$upload_dir=dirname(__FILE__).'/uploads/';
$temp_file=$_FILES['monfichier']['tmp_name'];
$dest_file=$_FILES['monfichier']['name'];
if (move_uploaded_file($temp_file, $upload_dir.$dest_file)) {
    echo "L'envoi a bien été effectué !";
} else {
    echo "Échec !";
}

#7 Le 11/01/2014, à 20:30

gringo75

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Bonjour à tous,

Merci beaucoup Bruno car ton code m'a permis de stocker l'image dans le répertoire uploads.
Une dernière question : si je veux directement afficher l'image sur la page cible_envoi.php, j'aiessayé différents codes mais je ne vois pas trop ?
J'ai par exemple essayé mais cela n'a pas marché :
$upload_dir=dirname(__FILE__).'/uploads/';
$temp_file=$_FILES['monfichier']['tmp_name'];
$dest_file=$_FILES['monfichier']['name'];
if (move_uploaded_file($temp_file, $upload_dir.$dest_file)) {
    echo "L'envoi a bien été effectué !"; <br/>
    echo "<img src="/uploads/monfichier" />
} else {
    echo "Échec !";
}

Pourrais-tu me renseigner. Merci d'avance pour ta (vos) réponse(s).
gringo75

Dernière modification par gringo75 (Le 11/01/2014, à 20:31)

Hors ligne

#8 Le 12/01/2014, à 11:04

bruno

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Il y a deux erreurs de syntaxe dans ton code au niveau des instructions echo. Je te laisse les trouver car elles sontt triviales (normalement PHP devrait t'afficher ces erreurs de manière explicite).

#9 Le 12/01/2014, à 11:43

gringo75

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Bonjour Bruno,
Oui effectivement smile
Si je ne me trompe pas, j'ai changé mon code en :
$upload_dir=dirname(__FILE__).'/uploads/';
$temp_file=$_FILES['monfichier']['tmp_name'];
$dest_file=$_FILES['monfichier']['name'];
if (move_uploaded_file($temp_file, $upload_dir.$dest_file)) {
    echo "L'envoi a bien été effectué ! <br/>";
    echo '<img src="/uploads/monfichier" />';
} else {
    echo "Échec !";
}


Toutefois, j'ai bien le message "l'envoi a été effectué" avec une sorte de miniature à la ligne suivante mais pas mon image. Est-ce que ce n'est pas la façon dont je nomme mon image (en l'occurence monfichier) qui pose problème img src="/uploads/monfichier" ?


Merci d'avance,

Dernière modification par gringo75 (Le 12/01/2014, à 11:50)

Hors ligne

#10 Le 12/01/2014, à 11:52

bruno

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Essaie ainsi :

echo '<img src="'.$upload_dir.$dest_file.'" />;

#11 Le 12/01/2014, à 13:06

compte supprimé x0

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

bruno a écrit :

Il y a deux erreurs de syntaxe dans ton code au niveau des instructions echo. Je te laisse les trouver car elles sontt triviales (normalement PHP devrait t'afficher ces erreurs de manière explicite).

Salut,

Ça dépend du paramétrage (/etc/php5/apache2/php.ini lignes 400 et suivantes)
Par défaut, chez moi, c'est ça :

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

et quelques lignes plus loin :

display_errors = Off

Je pense que ce serait judicieux de le mettre sur On et peut-être même d'enlever le ~E_STRICT qui inactive l'affichage des choses qui passent quoique un peu douteuses... Et tant qu'à faire, pour éviter l'utilisation de choses qui vont disparaître, d'enlever aussi le ~E_DEPRECATED. Donc finalement de ne garder que E_ALL quitte à tenir compte des warnings... ou pas, selon le cas.

Edit : relancer apache après la modification...

Dernière modification par Dr. Hugo Z. Hackenbush (Le 12/01/2014, à 13:17)

#12 Le 12/01/2014, à 21:30

J5012

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

je crois que quand on est passe de php 2 a 3, les devs du code ont dit qu'il fallait cesser d'utiliser echo, et utiliser print a la place, donc on trouve dans les man officiels ce remplacement, mais les tuto du net sont legion et continuent l'usage obsolete de echo ... d'ou certaines erreurs dues a la syntaxe ... ?

Hors ligne

#13 Le 14/01/2014, à 08:22

bruno

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Le manuel officiel de PHP ne dit rien de tel (et ne l'a jamais dit à ma connaissance) :
http://fr.php.net/manual/fr/function.echo.php
http://fr.php.net/manual/fr/function.print.php

Ce sont deux instructions différentes qui ont un comportement différent, différence sans doute un peu subtile pour le néophyte.
Quoiqu'il en soit,  il est préférable d'utiliser la commande echo plutôt que print.
http://www.zpmag.com/articles/echo.html

#14 Le 14/01/2014, à 20:30

J5012

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

j'ai un book de pearson education (campus press) 'programmation en php" de leon atkinson
http://www.leonatkinson.com/writing/cor … ogramming/

je ne retrouve plus la phrase (j'ai le book avec moi) mais je me souviens que l'assertion n'etait pas vraiment documentee au contraire de ton petit lien rigolo smile

donc je suppose que ca se ramene a la vieille gueguerre des pro et anti pearl ...

Hors ligne

#15 Le 14/01/2014, à 21:56

gringo75

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Bonsoir à tous,

Merci à tous pour vos contributions et notamment à Bruno.
Pour info, Bruno, j'ai essayé de modifier mon code en prenant en compte ta remarque (cf. en rouge) mais j'ai toujours le même problème, à savoir que j'ai une sorte de petite icône vide (qui doit sans doute être liée à la balise <img>.

<!DOCTYPE>
<html>
                <title>Test en cours</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<body>
   
<?php
$upload_dir=dirname(__FILE__).'/uploads/';
$temp_file=$_FILES['monfichier']['tmp_name'];
$dest_file=$_FILES['monfichier']['name'];
if (move_uploaded_file($temp_file, $upload_dir.$dest_file)) {
    echo "L'envoi a bien été effectué ! <br/>";
    echo '<img src="'.$upload_dir.$dest_file.'"/>';

}
else {
        echo "Échec !";
}

?>

Merci d'avance à celui qui pourra m'orienter......pour que je puisse enfin afficher le post comme résolu smile

Hors ligne

#16 Le 15/01/2014, à 17:54

bruno

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Il faut que tu regarde le code HTML généré pour comprendre où est l'erreur.Tous les navigateurs modernes ont des inspecteurs de code intégrés.

#17 Le 25/02/2014, à 23:07

gringo75

Re : [Résolu] Comment uploader un fichier en PHP du répertoire temporaire

Bonjour à tous,
J'ai résolu mon problème en utilisant un code plus simple qu'initialement tiré du site développez.com.
=>Vous aurez donc une image qui ira dans le dossier upload créé ET qui en même temps sera affiché sur la page web dès qu'elle sera téléchargée.
ça servira sans doute aux autres car après maintes recherches sur internet, je n'ai pas trouvé un seul site pour m'aider.

envoi.php :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>

<head>
  <title>Page Upload de fichiers</title>
</head>


<body>
	<form method="POST" action="upload.php" enctype="multipart/form-data">
     	<!-- On limite le fichier à 100Ko -->
     	<input type="hidden" name="MAX_FILE_SIZE" value="100000">
     	Fichier : <input type="file" name="avatar"><br/>  <!--avatar =>nom du champ du formulaire -->
     	<input type="submit" name="envoyer" value="Envoyer le fichier">
	</form>
</body>
</html>

upload.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>

<head>
  <title>Téléchargement OK</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>


<body>
<?php
	$dossier = 'upload/';
	$fichier = basename($_FILES['avatar']['name']);
	$taille_maxi = 100000;
	$taille = filesize($_FILES['avatar']['tmp_name']);
	$extensions = array('.png', '.gif', '.jpg', '.jpeg');
	$extension = strrchr($_FILES['avatar']['name'], '.'); 
//Début des vérifications de sécurité...
	if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
		{
     			$erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';
		}

	if($taille>$taille_maxi)
		{
     			$erreur = 'Le fichier est trop gros...';
		}

	if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
		{
     //On formate le nom du fichier ici...
     		$fichier = strtr($fichier, 
          	'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          	'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
		$fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);

     		if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
     		{
			
			echo 'Le fichier ' . $_FILES[avatar][name] . ' a été téléchargé avec succès';
			echo '<a href="'.$dossier.$fichier.'" /><img src="'.$dossier.$fichier.'"></a><br />'; 	

			
     		}
     		else //Sinon (la fonction renvoie FALSE).
     		{
          		echo 'Echec de l\'upload !';
     		}
		}
	else
		{
     			echo $erreur;
		}
?>

</body>
</html>

Hors ligne