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

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Boucle et $_FILE

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Boucle et $_FILE

n°1522965
lilougirl8
Posté le 02-03-2007 à 16:43:50  profilanswer
 

Bonjour,
 
J'aurais voulu savoir si il était possible de créer une boucle avec un $_FILE pour faire un upload de fichier "automatique"..
J'explique :  
J'ai donc 8 <input> qui ont pour nom photo1, photo2 .....
Je recupère le fichier pour photo1 avec if(isset($_FILE['photo1']))...etc...
 
Ma question suis'je obliger de copier 8 fois le code (assez long) pour chaque champs?
 
Ou estce possible de procéder ainsi :  
<input> name="photo[]" </input>
 puis faire un boucle genre foreach($photo as $value) (comme pr les checkbox un peu) ...??

mood
Publicité
Posté le 02-03-2007 à 16:43:50  profilanswer
 

n°1522966
gooopil
pfiew
Posté le 02-03-2007 à 16:45:40  profilanswer
 

et un  
for ($i...) { if isset($_FILE['photo'.$i]) ...
 
??

n°1522969
omega2
Posté le 02-03-2007 à 16:50:16  profilanswer
 

gooopil > un "foreach" ( voir doc ) serait beaucoup plus simple, prendrait tous les fichiers quelque soit le nom du composant html et éviterait de devoir tester l'existance vu qu'on boucle sur ce qui existe.

n°1522975
gooopil
pfiew
Posté le 02-03-2007 à 17:02:15  profilanswer
 

omega2 a écrit :

gooopil > un "foreach" ( voir doc ) serait beaucoup plus simple, prendrait tous les fichiers quelque soit le nom du composant html et éviterait de devoir tester l'existance vu qu'on boucle sur ce qui existe.


 
J'avais pas vu sa suggestion du foreach. C'est une possibilité aussi...

n°1522979
lilougirl8
Posté le 02-03-2007 à 17:05:41  profilanswer
 

dac donc apparement j'était pas a l'ouest... :D, alors donc comment m'y prendre au niveaux "syntaxe" car le problème quand j'avais essayer c'est qu'il me trouvai pas le fichier puisqu'il les considère comme tableau... donc si je compren bien il me recupère chaque ficher comme une ligne d'un array ?

n°1523012
omega2
Posté le 02-03-2007 à 17:58:37  profilanswer
 

A la page http://fr3.php.net/manual/fr/features.file-upload.php t'as la description du contenu normal de $_FILE.
Comme tu peux voir entre les deux blocs gris,$_FILE est un tableau dont chaque case contient un autre tableau. Le tableau contenu par chaque case est constitué des éléments "name", "type", "size", "tmp_name" et "error". (voir la page indiqué pour la description)
 
Donc t'as assez bien compris le truc. Grace au foreach, tu aura accés aux informations de chaque fichier. Il te restera ensuite à utiliser ces informations comme dans les exemples de la documentation pour traiter les fichiers qui t'ont été envoyé.

n°1523018
lilougirl8
Posté le 02-03-2007 à 18:10:08  profilanswer
 

Code :
  1. foreach($_FILES['photo'] as $key)
  2.    {
  3.   /*======= Définition des variables ==============*/
  4.   $nom = $key['name'];
  5.   $nom_temporaire =  $key['tmp_name'];
  6.   $nom_sans_extension = basename($key['name'],".jpg" );
  7.   $nom_dossier = substr($nom_sans_extension, 0, -2);
  8.   /*===============================================*/
  9.   /*=========== Varibles restriction ===============*/
  10.    $extensions = array('.png', '.gif', '.jpg', '.jpeg');//On crée un tableau avec les extensions autorisées
  11.    $extension_test = strrchr($key['name'], '.');//on recupère l'extension pour la tester
  12.    $taille_maxi = 1000000;// taille maximum (en octets)
  13.    $taille = filesize($key['tmp_name']);//Taille du fichier  
  14.    /*===============================================*/
  15.  
  16.   /*============ Chemin dossier ===================*/
  17.   $chemin_ftp = 'html/villas/'.$nom_dossier.'';
  18.   $chemin_ftp2 = 'html/villas/'.$nom_dossier.'/';
  19.   $chemin_local = './villas/'.$nom_dossier.'';
  20.   $chemin_local2 = './villas/'.$nom_dossier.'/';
  21.   /*===============================================*/
  22.   $command = 'chmod 0777 '.$chemin_ftp;
  23.      
  24.   /*===============  Definition des erreurs ===========================================*/
  25.   if(!in_array($extension_test, $extensions)) //Si l'extension n'est pas dans le tableau
  26.     {
  27.          $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';//on créer une variable erreur
  28.     }
  29.   if($taille > $taille_maxi)//Si La taille est trop grande   
  30.        {
  31.               $erreur = 'Le fichier est trop gros...';// on définit un erreur pour la taille
  32.               }
  33.    /*==================================================================================*/
  34.  
  35.   if(!isset($erreur))//Si il n'y a pas d'erreur
  36.  
  37.   if (is_dir($chemin_local))
  38.      {
  39.     if (file_exists($chemin_local2.$name))
  40.     {
  41.     ftp_delete($conn_id,$chemin_ftp2.$name) or die("Impossible de supprimer le fichier $nom" ) ;
  42.        creation_photo($nom,$nom_temporaire, $nom_dossier);
  43.     }
  44.     else
  45.     {
  46.     creation_photo($nom,$nom_temporaire, $nom_dossier);
  47.     }
  48.     }
  49.      else
  50.     {
  51.            ftp_mkdir($conn_id, $chemin_ftp)or die("Impossible de créer le dossier $nom_dossier" );
  52.            ftp_site($conn_id,$command)or die("Impossible modifier les droits" );
  53.            creation_photo($nom,$nom_temporaire, $nom_dossier);
  54.         }    
  55.  }
  56. else
  57.     {
  58.  echo $erreur;
  59.  }


 
Bon c'est un bout de mon code...j'ai pas tester encore je sais qu'il manke des parametre, je ne sais pas par quelle bout commencer


Message édité par lilougirl8 le 02-03-2007 à 18:51:13
n°1523035
omega2
Posté le 02-03-2007 à 18:28:48  profilanswer
 

C'est toi qui a fait ce code là?
Là, pour le moment, ca donne l'impression que c'est sencé envoyer les fichier à un serveur ftp distant et non pas les stocker simplement sur le même serveur que le site internet. C'est bien ça que tu veux faire?


Message édité par omega2 le 02-03-2007 à 18:31:51
n°1523039
lilougirl8
Posté le 02-03-2007 à 18:33:35  profilanswer
 

oui oui c'est tout a fait ça

n°1523040
lilougirl8
Posté le 02-03-2007 à 18:34:26  profilanswer
 

j'ai mis a jour e code je vous explique donc... c'est pour un upload de photo, je veux donc faire ça dynamiquement plutot que m'embeter a tout copier 10 fois

mood
Publicité
Posté le 02-03-2007 à 18:34:26  profilanswer
 

n°1523045
lilougirl8
Posté le 02-03-2007 à 18:38:41  profilanswer
 

J'ai un problème la apparement il me met un illegal offset

n°1523048
omega2
Posté le 02-03-2007 à 18:43:37  profilanswer
 

ok, donc j'image que creation_photo existe vraiment et marche bien.
 
foreach te donne directement le contenu des cases et non pas la clé. Si la clé t'intéresse également alors il faut le préciser :
" foreach($_FILES['photo'] as $macase) " est sans la clé
" foreach($_FILES['photo'] as $key => $macase) " est avec la clé
 
 
Dans ton code, si on garde le même foreach que celui que tu as mis, alors "$name = $_FILES['photo']['name'][$key];" deviens "$name = $key['name'];" .
 
Je te laisse corriger les autres lignes et modifier le nom de la variable $key si t'as envie.
 
EDIT : ton code était mieux avant ta derniére modif vu qu'avant la modif il n'avait pas de bug. ;)


Message édité par omega2 le 02-03-2007 à 18:44:57
n°1523052
lilougirl8
Posté le 02-03-2007 à 18:52:36  profilanswer
 

ben j'ai fait la correction mai ça prend pas plus d'erreur mais pas de upload...grrrr lol..
 
edit : L'erreur a l'air de se situé au niveau de la restiction des extension... il me dit que l'extension n'ai pas bonne...je suppose que ça deconne avant donc au moment ou je déclare les varables
 
Merci de m'aider c'est sympa ;)


Message édité par lilougirl8 le 02-03-2007 à 18:53:56
n°1523059
omega2
Posté le 02-03-2007 à 19:11:49  profilanswer
 

Deux trucs que je viens de penser :
1) il faut détruire la variable $erreur aprés chaque fichier pour éviter que la détection d'une erreur ne bloque un autre fichier. Autre solution, utiliser un booléen que tu mais à faux (FALSE) quand tu commences à traiter un fichier et à vrai (TRUE) quand tu trouves une erreur. Dans ce cas là il faut vérifier la valeur du booléen.
2) un test sur l'extension n'est pas fiable pour savoir si c'est vraiment une image. D'une part celui qui l'envoie peut trés bien changé l'extension avant de te l'envoyer et d'autre part tous les systémes d'exploitations ne se basent pas là dessus pour savoir quel logiciel lancer quand on clique sur tel ou tel fichier. Parmis les utilisateurs de mac, il y en a un certain nombre qui ne pensent pas souvent à mettre une extension à leur fichier à cause de ça.
En php, parmis les fonctions de la librairie GD, il en existe une qui permet d'obtenir des informations sur les images telles que les dimensions en pixel et le type d'image. Ca sera beaucoup plus fiable comme test.
 
Là, je n'ai pas le temps de me pencher d'avantage sur ton code. Il fonctionnait bien quand tu n'envoyais qu'un seul fichier à la fois?
 
 
 
 
Derniére idée en passant, tu n'aurais pas une majuscule dans ton extension par hasard? Ca serait plus prudent de la mettre en minuscule avant de la tester. (de mémoire, la fonction qui permet ça à pour nom "lower" )


Message édité par omega2 le 02-03-2007 à 19:13:40
n°1523064
lilougirl8
Posté le 02-03-2007 à 19:18:26  profilanswer
 

Code :
  1. foreach($_FILES["photo"]["name"] as $key => $name)
  2.    {
  3.   /*======= Définition des variables ==============*/
  4.   $nom = $_FILES["photo"]["name"][$key];
  5.   $nom_temporaire =  $_FILES["photo"]["tmp_name"][$key];
  6.   $nom_sans_extension = basename($_FILES["photo"]["name"][$key],".jpg" );
  7.   $nom_dossier = substr($nom_sans_extension, 0, -2);
  8.   /*===============================================*/
  9.   /*=========== Varibles restriction ===============*/
  10.    $extensions = array('.png', '.gif', '.jpg', '.jpeg');//On crée un tableau avec les extensions autorisées
  11.    $extension_test = strrchr($_FILES["photo"]["name"][$key], '.');//on recupère l'extension pour la tester
  12.    $taille_maxi = 1000000;// taille maximum (en octets)
  13.    $taille = filesize($_FILES["photo"]["tmp_name"][$key]);//Taille du fichier  
  14.    /*===============================================*/
  15.  
  16.   /*============ Chemin dossier ===================*/
  17.   $chemin_ftp = 'html/villas/'.$nom_dossier.'';
  18.   $chemin_ftp2 = 'html/villas/'.$nom_dossier.'/';
  19.   $chemin_local = './villas/'.$nom_dossier.'';
  20.   $chemin_local2 = './villas/'.$nom_dossier.'/';
  21.   /*===============================================*/
  22.   $command = 'chmod 0777 '.$chemin_ftp;
  23.      
  24.   /*===============  Definition des erreurs ===========================================*/
  25.   if(!in_array($extension_test, $extensions)) //Si l'extension n'est pas dans le tableau
  26.     {
  27.          $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';//on créer une variable erreur
  28.     }
  29.   if($taille > $taille_maxi)//Si La taille est trop grande   
  30.        {
  31.               $erreur = 'Le fichier est trop gros...';// on définit un erreur pour la taille
  32.               }
  33.    /*==================================================================================*/
  34.  
  35.   if(!isset($erreur))//Si il n'y a pas d'erreur
  36.  
  37.   if (is_dir($chemin_local))
  38.      {
  39.     if (file_exists($chemin_local2.$nom))
  40.     {
  41.     ftp_delete($conn_id,$chemin_ftp2.$nom) or die("Impossible de supprimer le fichier $nom" ) ;
  42.        creation_photo($nom, $nom_temporaire, $nom_dossier);
  43.     }
  44.     else
  45.     {
  46.     creation_photo($nom,$nom_temporaire, $nom_dossier);
  47.     }
  48.     }
  49.      else
  50.     {
  51.            ftp_mkdir($conn_id, $chemin_ftp)or die("Impossible de créer le dossier $nom_dossier" );
  52.            ftp_site($conn_id,$command)or die("Impossible modifier les droits" );
  53.            creation_photo($nom,$nom_temporaire, $nom_dossier);
  54.         }    
  55.  }
  56. else
  57.     {
  58.  echo $erreur;
  59.  }


 
Voila le code fonctionnel avec le if.... je reprend du début parce que il faut que je comprenne aussi et pas que je copie betement...
 
Donc... foreach me permet de recupérer les valeur pour chaque photo postées...
 
donc en gro foreach ($_FILES['photo'] as $name) veux dire pour chaque photo qui a une valeur tu fai ça....{      }
 
donc le input devrait ressembler à ça :  
 
<input type="file" name="photo[]" />
 
ensuite j'aimerai donc avoir une clé (plus facile pour identifier chaque foto différement je suppose)
 
Alors ça donnerai ça : foreach ($_FILES['photo'] as $name => $key) (donc pour chaque foto qui a un nom on defini une clé et on fai ...{    }
 
 
EDIT : Hop voila la réponse j'ai reussi, bon ce que j'ai fai et que je fait toujours, j'ai repris du début, sur un tout petit code test pour comprendre le fonctionnement en en plus en local.. bcp plus simple, j'ai fai différent essai a partir du code fourni ds le manuel php..., dison que je men suis inspiré... ça sert a ça aussi... voili voilou ...maitenent reste le pb des erreur qui font chier.. je vai voir ça aussi..
 
Comment je fait sinon pour le coup des extension?? je vois pa tro comment je pourrait faire autrement que ça???


Message édité par lilougirl8 le 02-03-2007 à 22:16:58

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

  [PHP] Boucle et $_FILE

 

Sujets relatifs
[PHP] Supprimer les 5 denrières lignes d'un fichier[PHP] comparaison string vs integer (résolu)
[PHP] Probleme de variable dans une clause WHERE[PHP] passer caractères accentués en majuscule
[PHP objet] p'tit coup de main ![PHP] problème code...
[Grammaire] Lex et Yacc pour Php[PHP] Recupérer les 1er caracteres d'un mot
[PHP] parcours de fichiers dans un dossiers[PHP] supprimer contenu d'une table mysql
Plus de sujets relatifs à : [PHP] Boucle et $_FILE


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