Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2863 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Fonction upload php

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction upload php

n°1663498
Clapsou
Posté le 27-12-2007 à 21:45:24  profilanswer
 

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

mood
Publicité
Posté le 27-12-2007 à 21:45:24  profilanswer
 

n°1663579
FlorentG
Unité de Masse
Posté le 28-12-2007 à 09:53:05  profilanswer
 

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

n°1663580
Mxtrem
Posté le 28-12-2007 à 10:03:30  profilanswer
 

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

n°1663599
the_bigboo
Posté le 28-12-2007 à 11:39:38  profilanswer
 

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.

n°1663838
Clapsou
Posté le 28-12-2007 à 23:40:52  profilanswer
 

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
n°1663899
the_bigboo
Posté le 29-12-2007 à 12:33:43  profilanswer
 

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. }

n°1663900
Clapsou
Posté le 29-12-2007 à 12:42:08  profilanswer
 

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

n°1663914
the_bigboo
Posté le 29-12-2007 à 14:18:15  profilanswer
 

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..

n°1663916
FlorentG
Unité de Masse
Posté le 29-12-2007 à 14:37:35  profilanswer
 

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 :(

n°1663949
the_bigboo
Posté le 29-12-2007 à 15:58:14  profilanswer
 

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:

mood
Publicité
Posté le 29-12-2007 à 15:58:14  profilanswer
 

n°1663950
FlorentG
Unité de Masse
Posté le 29-12-2007 à 16:04:19  profilanswer
 

Effectivement

n°1663962
Clapsou
Posté le 29-12-2007 à 17:28:06  profilanswer
 

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
n°1664008
wrksx
Posté le 29-12-2007 à 20:14:47  profilanswer
 

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

n°1664029
the_bigboo
Posté le 30-12-2007 à 00:29:06  profilanswer
 

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 !

n°1664221
omega2
Posté le 31-12-2007 à 11:45:54  profilanswer
 

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 $_* .

n°1664317
Clapsou
Posté le 31-12-2007 à 17:13:19  profilanswer
 

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!

n°1664502
Clapsou
Posté le 01-01-2008 à 20:00:26  profilanswer
 

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..

n°1664505
Clapsou
Posté le 01-01-2008 à 20:06:02  profilanswer
 

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..

n°1664538
the_bigboo
Posté le 01-01-2008 à 23:19:56  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Fonction upload php

 

Sujets relatifs
Nombre de valeurs passées à une fonction, inconnue.Fonction avec parametre en char * et appel avec string
fonction conditionnelle ?Utiliser un variable, lancer une fonction d'un autre movieclip?
fonction saisie ligne sans limiteutiliser la fonction number_format() pour ajouter une virgule
UPLOAD de fichier fonction ftpFonction is_upload_file
Fonction $_FILES avec limitation d'upload[PHP] fonction FTP_ et upload à partir d'un disque local
Plus de sujets relatifs à : Fonction upload php


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR