Fonction upload php

Fonction upload php - PHP - Programmation

Marsh Posté le 27-12-2007 à 21:45:24    

Bonjour,
 
J'utilise la fonction upload de php sur mon site afin de permettre aux visiteurs de créer leur avatar pour mon forum. Après l'upload une série de tests vérifient l'extension du fichier et déplace le fichier vers un répertoire définitif en le renommant avec l'identifiant unique du visiteur. Le problème c'est que l'espace d'upload temporaire dans lequel le fichier est d'abord uploadé avant déplacement semble être la racine de mon ftp (je suis hébergé chez multimania). Du coup, si un fichier de même nom se trouvait déjà sur le ftp (par exemple une page, une image de mon site), le fichier uploadé le remplace.
Je ne sais pas comment faire car tous les tests possibles ne peuvent se faire qu'après l'upload du fichier dans l'espace temporaire!
Merci de m'aider si quelqu'un à une solution!
 
Romain

Reply

Marsh Posté le 27-12-2007 à 21:45:24   

Reply

Marsh Posté le 28-12-2007 à 09:53:05    

Normalement le fichier est renommé en un nom unique temporaire, ça ne devrait jamais écraser quelque chose d'existant... Imagine les problèmes de sécurités. Si un fichier est écrasé, c'est qu'il y a un problème ailleurs

Reply

Marsh Posté le 28-12-2007 à 10:03:30    

C'est quoi ce délire ? :heink:

Reply

Marsh Posté le 28-12-2007 à 11:39:38    

De toute facon c'est le serveur Web qui appele nomme les fichiers temporaires. Tu n'as de toute facon pas à t'en soucier puisque tu n'intervient à aucun moment.

Reply

Marsh Posté le 28-12-2007 à 23:40:52    

Rebonjour,
 
Ben je ne comprends pas, lorsque j'upload un fichier avec mon script il s'upload à la racine de mon site avec le nom d'origine du fichier et ce quelques soient les contrôles sur le fichier que je peux réaliser. Ainsi, si un fichier de même nom existe déjà il est écrasé. La seule solution que j'ai trouvé c'est de mettre toutes mes pages et images dans des dossiers et non à la racine du site, comme ça je suis sur qu'ils ne seront pas écrasés sauf pour la page index pour laquelle le problème persiste!!
 
Je vous mets mon script. Il s'agit d'un script pour que les gens du forum se créeent un avatar :
 
*****************************
Voici le formulaire :
 

Code :
  1. <form action="?" method="post" target="_self" enctype="multipart/form-data">
  2. <center><table width="500" height="100" cellpadding="5">
  3. <tr><td width="100%" haight="30" align=left valign=middle><font face="Century Gothic" size="1" color="#000000"><b>Avatar (100 K0 max. ; format gif ou jpg ; 100*100 pixels max. sinon recadrage) :</b></font></td></tr>
  4. <tr><td width="100%" haight="30" align=center valign=middle><input type="hidden" name="id_ad" value="<? echo $id_ad ?>">
  5. <input type="hidden" name="MAX_FILE_SIZE" value="100000" ><input type="file" size="20" class="form" name="userfile"><?if ($err == "1" ) { ?><font face="tahoma" size="1" color=#FF0000> Un fichier de même nom existe déjà sur le serveur</font> <?} else if ($err == "2" ) { ?><font face="tahoma" size="1" color=#FF0000> Erreur de téléchargement, le fichier est peut-être trop gros</font> <?} else if ($err == "3" ) { ?><font face="tahoma" size="1" color=#FF0000> Le fichier doit être en gif ou jpg</font> <?}?></td></tr>
  6. <tr><td width="100%" haight="40" align=center valign=middle><input type=submit value="Ok" class="form">
  7. <input type="hidden" name="partie" value="avatar">
  8. <input type="hidden" name="auth" value="1">


 
*****************************
Après envoi du formulaire on revient à la même page avec la variable $auth = 1 donc on exécute le script suivant :
 

Code :
  1. if ($auth == "1" )
  2. {
  3. if (file_exists($userfile_name))
  4. { ?><script>window.location="?partie=avatar&err=1&id_ad=<? echo $id_ad ?>";</script><? }
  5. else
  6. {
  7. if (copy($userfile,$userfile_name))
  8. {
  9. $repdestination="avatars/";
  10. $nomfichier = $userfile_name;
  11. $extension = substr($nomfichier, strrpos($nomfichier, "." ));
  12. if ($extension != ".gif" AND $extension != ".jpg" )
  13. { ?><script>window.location="?partie=avatar&err=3&id_ad=<? echo $id_ad ?>";</script><? }
  14. else
  15. {
  16. $cheminfichier = "avatar".$id_ad.$extension;
  17. rename($userfile_name, $repdestination.$cheminfichier);
  18. require("identif.php3" );
  19. mysql_connect($host, $user, $pass) or die("Impossible de se connecter à la base de données !" );
  20. mysql_select_db($database) or die("Impossible de selectionner la base !" );
  21. mysql_query("UPDATE adherents SET avatar='$cheminfichier' WHERE id_ad='$id_ad'" );
  22. ?>
  23. <br><br><br><font face="Century Gothic" size="1" color="#000000">Informations enregistrées</font>
  24. <?
  25. }
  26. }
  27. else
  28. {
  29. ?>
  30. <script>window.location="?partie=avatar&err=2&id_ad=<? echo $id_ad ?>";</script>
  31. <?
  32. }
  33. }
  34. }
  35. ?>


 
Qu'en pensez vous ? En gros tous les contrôles sur l'existence d'un fichier de même nom, l'extension du fichier etc ne servent à rien car le fichier est déjà uploadé à la racine. Ils ne permettent que de déplacer ou non le fichier uploadé dans le répertoire de stockage des avatars.
Comment puis-je faire ?
 
Merci beaucoup !
 
Romain

Message cité 1 fois
Message édité par Clapsou le 29-12-2007 à 18:52:22
Reply

Marsh Posté le 29-12-2007 à 12:33:43    

Déjà utilises les balises CPP sinon tu vas te faire taper sur les doigts par un Modo :/
 
D'autre part il semblerai que tu utilises les variables globales avec cd code, c'est pas franchement recomandé car ca ne sera pas franchement portable...
 
Et pour infos, un upload correct se fait de la facon suivante :
Formulaire HTML :

Code :
  1. <form method="POST" enctype="multipart/form-data">
  2. <input type="file" name="fichier">
  3. <input type="submit" value="OK">
  4. </form>


Et le traitement associé :

Code :
  1. $tempory_file_name = $_FILES['fichier']['tmp_name'] ;
  2. $destination_directory = '../chemin/vers/mon/dossier/' ;
  3. // Verification de l'extension
  4. if( !in_array( array_pop( explode( '.' , $_FILES['fichier']['name'] ) ) , array( 'gif' , 'jpg' ) ) die('mauvaise extension !');
  5. // Traitement simple au possible
  6. if( move_uploaded_file( $tempory_file_name , $destination_directory.$_FILES['fichier']['name'] ) )
  7. {
  8.   die('fichier uploadé !');
  9. }
  10. else
  11. {
  12.   die('Erreur pendant le traitement du fichier !') ;
  13. }

Reply

Marsh Posté le 29-12-2007 à 12:42:08    

the_bigboo a écrit :

Déjà utilises les balises CPP sinon tu vas te faire taper sur les doigts par un Modo :/
 
D'autre part il semblerai que tu utilises les variables globales avec cd code, c'est pas franchement recomandé car ca ne sera pas franchement portable...
 
Et pour infos, un upload correct se fait de la facon suivante :
Formulaire HTML :

Code :
  1. <form method="POST" enctype="multipart/form-data">
  2. <input type="file" name="fichier">
  3. <input type="submit" value="OK">
  4. </form>


Et le traitement associé :

Code :
  1. $tempory_file_name = $_FILES['fichier']['tmp_name'] ;
  2. $destination_directory = '../chemin/vers/mon/dossier/' ;
  3. // Verification de l'extension
  4. if( !in_array( array_pop( explode( '.' , $_FILES['fichier']['name'] ) ) , array( 'gif' , 'jpg' ) ) die('mauvaise extension !');
  5. // Traitement simple au possible
  6. if( move_uploaded_file( $tempory_file_name , $destination_directory.$_FILES['fichier']['name'] ) )
  7. {
  8.   die('fichier uploadé !');
  9. }
  10. else
  11. {
  12.   die('Erreur pendant le traitement du fichier !') ;
  13. }



 
 
Pardon d'avoir oublié les balises cpp.
Je ne sais pas bien ce que sont des variables globales avec cd code. Qu'est ce que c'est ? Qu'est ce que tu entends par "ce n'est pas portable" ?
Les pages de mon site sont en php3, c'est pour cela que je n'utilise pas les variables que tu utilises toi qui sont du php4, non ?
Sinon dans mon code, y a t il un problème qui fait que le fichier s'upload à la racine du site quels que soient les test que j'effectue ?
Merci
 
Romain

Reply

Marsh Posté le 29-12-2007 à 14:18:15    

une variable global c'est par exemple d'utiliser directement :

Code :
  1. $variable

pour une données située dans l'url du type http://www.monsite.com/?variable=4 au lieu de faire :

Code :
  1. $variable = $_GET['variable'];


Ce que je veux dire par pas portable :voila un url de test :

Code :
  1. http://www.monsite.com/?variable=4


Avec les register_globals activées :

Code :
  1. echo $variable ;// Affichera "4"


Acev les register_globals désactivées

Code :
  1. echo $variable ; // Renverra une erreur de type notice car la variable n'est pas définie
  2. // Il faut faire avant :
  3. $variable = $_GET['variable'] ;
  4. echo $variable ; // Affichera "4"


Seules les fonctions diffèrent entre les différentes versions de PHP ainsi que quelques notations. Parler de variable PHP3 ou PHP4 ne veut absolument rien dire ! Mets donc ton code proprement dans des balises CPP mais complet car a la vue de ce que tu montres il y a plein de déclaration de variables manquantes..

Reply

Marsh Posté le 29-12-2007 à 14:37:35    

Clapsou a écrit :

RAprès envoi du formulaire on revient à la même page avec la variable $auth = 1 donc on exécute le script suivant :
 

Code :
  1. if ($auth == "1" )
  2. {
  3. if (file_exists($userfile_name))
  4. {
  5. ?>
  6. <script>window.location="?partie=avatar&err=1&id_ad=<? echo $id_ad ?>";</script>
  7. <?
  8. }
  9. else
  10. ...



Evite à tout prix ce genre de trucs. Les redirections, ça se fait côté serveur via les entêtes HTTP. Mais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais avec un bout de script louche comme ça :(

Reply

Marsh Posté le 29-12-2007 à 15:58:14    

De plus je vois pas l'intéret de file_exists si dans ce cas la c'est plus is_file qui devrait etre employé :spamafote:

Reply

Marsh Posté le 29-12-2007 à 15:58:14   

Reply

Marsh Posté le 29-12-2007 à 16:04:19    

Effectivement

Reply

Marsh Posté le 29-12-2007 à 17:28:06    

the_bigboo a écrit :

une variable global c'est par exemple d'utiliser directement :

Code :
  1. $variable

pour une données située dans l'url du type http://www.monsite.com/?variable=4 au lieu de faire :

Code :
  1. $variable = $_GET['variable'];


Ce que je veux dire par pas portable :voila un url de test :

Code :
  1. http://www.monsite.com/?variable=4


Avec les register_globals activées :

Code :
  1. echo $variable ;// Affichera "4"


Acev les register_globals désactivées

Code :
  1. echo $variable ; // Renverra une erreur de type notice car la variable n'est pas définie
  2. // Il faut faire avant :
  3. $variable = $_GET['variable'] ;
  4. echo $variable ; // Affichera "4"


Seules les fonctions diffèrent entre les différentes versions de PHP ainsi que quelques notations. Parler de variable PHP3 ou PHP4 ne veut absolument rien dire ! Mets donc ton code proprement dans des balises CPP mais complet car a la vue de ce que tu montres il y a plein de déclaration de variables manquantes..


 
Ok je comprends! Je pensais que cette nouvelle déclaration de variable correspondait à l'évolution de php 3 vers php4 c'est pour ça que je parlais de "variables php 3 ou php4".
Pour l'instant tout marche en appelant directement les variables par $. register_globals doit être toujours activées pour le moment chez multimania, free et autres hébergeurs gratuits. Quelqu'un sait-il si ils pensent bientôt désactiver register_globals ? car ça me demanderait pas mal de travail de traduire toutes les pages de mon site en déclarant ainsi les variables avec $_GET, $_POST, etc
En plus je ne sais pas comment du coup déclarer les variables utilisées "ponctuellement", pour une boucle par exemple (genre  for($i=0;...) comment déclarer $i ?), puisqu'elle sont créées "pour l'occasion" et ne proviennent ni d'un formulaire ni d'un url etc
Merci


Message édité par Clapsou le 29-12-2007 à 17:30:00
Reply

Marsh Posté le 29-12-2007 à 20:14:47    

qd tu écrit for ($i =0 ...
la varible est créé/declarée/initialisée automatiquement
 

Reply

Marsh Posté le 30-12-2007 à 00:29:06    

Ce n'est pas une question de parametre activé ou non.
Ton application a BESOIN que l'option soit activée pour fonctionner.
Une application portable est par définition une application qui fonctionne quelle que soit la configuration et ne dépends ( ou au minimum ) d'aucun parametre d'environnement.
 
Imagine que bientot multimania arrete l'hébergement et que tu doive mettre ton application aiileurs ? Sache par ailleurs que la configuration par défaut de PHP5 ( qui sera devenu standard d'ici le 31 ) a par défaut les globales de désactivées !

Reply

Marsh Posté le 31-12-2007 à 11:45:54    

T'es sur que multimania est en php3? Quand j'avais mon site dessus en 2000 ils en étaient déjà au php4 et maintenant on peut lire sur leur page d'accueil : "Créez votre propre site internet en quelques clics. Multimania est entièrement gratuit! Désormais avec 1024 Mo de stockage et PHP5."
 
Par contre il est fort possible qu'ils aient gardé le "register_global" à on pour éviter que la majorité des sites ne tombent en panne à cause de l'utilisation de "variable globale" au lieux des variables $_* ($_POST, $_GET, $_SERVER, etc). Ca n'est que retarder l'inévitable, il faudra bien qu'ils installe tôt ou tard un php6 ou supérieur et là ce paramètre n'existera plus et donc il n'y aura plus de création automatique des variables globales à partir du contenu des variables $_* .

Reply

Marsh Posté le 31-12-2007 à 17:13:19    

Bonjour,
 
Bon je viens de revoir tous mes scripts pour modifier mes variables globales et les déclarer correctement. Du coup mon script pour l'upload me fait un truc bizarre.
Le fichier s'upload bien, il est bien déplacé dans le répertoire voulu, par contre lorsque je souhaite l'utiliser dans mon site (ce sont des images avatars pour le forum), et bien l'image ne s'affiche pas. En fait le fichier a des permissions restrictives : lorsque l'on clique droit sur l'image et que l'on fait afficher l'image on nous dit que l'on a pas la permission de voir ce fichier et quand je regarde sur mon ftp le fichier n'a effectivement pas les permissions de lecture pour le public. C'est très bizarre.
Quelqu'un a déjà eu ce problème ??
Merci d'avance!

Reply

Marsh Posté le 01-01-2008 à 20:00:26    

omega2 a écrit :

T'es sur que multimania est en php3? Quand j'avais mon site dessus en 2000 ils en étaient déjà au php4 et maintenant on peut lire sur leur page d'accueil : "Créez votre propre site internet en quelques clics. Multimania est entièrement gratuit! Désormais avec 1024 Mo de stockage et PHP5."
 
Par contre il est fort possible qu'ils aient gardé le "register_global" à on pour éviter que la majorité des sites ne tombent en panne à cause de l'utilisation de "variable globale" au lieux des variables $_* ($_POST, $_GET, $_SERVER, etc). Ca n'est que retarder l'inévitable, il faudra bien qu'ils installe tôt ou tard un php6 ou supérieur et là ce paramètre n'existera plus et donc il n'y aura plus de création automatique des variables globales à partir du contenu des variables $_* .


 
 
Oui en fait c'est ce que je voulais dire. Ils offrent le choix entre php 4 ou 5 . Par contre le register global est pour l'instant toujours à "on" comme sur beaucoup d'hébergeur mutualisé. Jusqu'à quand, ça je ne sais pas. Mais bon, à la suite de tous vos conseils j'ai modifié mes scripts en déclarant mes variables globales avec $_POST, $_GET, etc. Mieux vaut prévenir que guérir en effet..

Reply

Marsh Posté le 01-01-2008 à 20:06:02    

Pour infos, mon pb de permissions limitées des fichiers uplaodés est réglé. En fait lorsque je travaillais en variables globales du style $monfichier_name, j'utilisais la fonction rename pour déplacer mes fichiers vers un répertoire définitif. Il semblerait donc que le problème vienne de l'utilisation de cette fonction rename avec des variables déclarées par $_FILES* puisqu'en utilisant la fonction move_uploaded_files tout marche tres bien.
Bizarre quand même..

Reply

Marsh Posté le 01-01-2008 à 23:19:56    

Comme je te l'ai montré je crois, c'est move_uploaded_file qu'il faut utiliser ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed