IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Upload de fichier via un formulaire ayant plusieurs fieldsets [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Upload de fichier via un formulaire ayant plusieurs fieldsets
    bonjour à tous,
    j'ai créé un petit formulaire d'upload d'images. L'utilisateur peut choisir de 1 à 5 images à uploader et il peut également leur attribuer un titre et une légende.
    pour chaque image on a un fiedset :
    code HTML du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <form action="" enctype="multipart/form-data" method="post" accept-charset="ISO-8859-1" title="Add items" id="formadditem">
                        	<fieldset name="item0">
                            <label for="image0">Choisissez une image</label>
                            <input type="file" name="image0" />
                            <label for="titre0">Titre : </titre>
                            <input type="text" name="titre0" />
                            <label for="legende0">Legende : </titre>
                            <input type="text" name="legende0" />
                            </fieldset>
                            ..... 
                            <input type="submit" name="submititems" id="submititems" />
                        </form>
    code PHP pour récuperer le poids du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    foreach($_POST as $fieldset=>$currentitem){
    		if($fieldset != 'nbimgs'&& $fieldset != 'submititems'){
    			foreach($currentitem as $fieldname=>$propval){
    				$propname = substr($fieldname, 0, strlen($fieldname)-1);
    				if($propname=="image" && $propval!=NULL && $propval != ''){
    					$taille = filesize($_FILES[$fieldname]['tmp_name']);
    					echo '<br />'.$taille.'<br />';
    				}
    				$processor->XMLaddPopulatedNode($itemNode, $propname, $propval);
    			}
    		}
    cela me renvoit l'erreur :
    Notice: Undefined index: image0 in C:\Program Files\EasyPHP 3.0\www\.....

    Pour la récupération du titre et de la légende en revanche pas de souci ( toutes ces infons sont retranscrites dans un fichier XML et cette partie du code marche très bien)

    Merci d'avance pour votre aide

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Je suppose que l'erreur correspond à cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $taille = filesize($_FILES[$fieldname]['tmp_name']);
    où $fieldname vaut image0

    Déjà, as-tu vérifié ce que contenait $_FILES avec un bon vieux print_r ?

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Salut, merci pour ta réponse,
    voila le résultat du print_r($FILES);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    Array
    (
        [item0] => Array
            (
                [name] => Array
                    (
                        [image0] => bgBulle.gif
                    )
     
                [type] => Array
                    (
                        [image0] => image/gif
                    )
     
                [tmp_name] => Array
                    (
                        [image0] => C:\Program Files\EasyPHP 3.0\tmp\php78.tmp
                    )
     
                [error] => Array
                    (
                        [image0] => 0
                    )
     
                [size] => Array
                    (
                        [image0] => 1027
                    )
     
            )
     
        [item1] => Array
            (
                [name] => Array
                    (
                        [image1] => btn_ouvirLivret.gif
                    )
     
                [type] => Array
                    (
                        [image1] => image/gif
                    )
     
                [tmp_name] => Array
                    (
                        [image1] => C:\Program Files\EasyPHP 3.0\tmp\php79.tmp
                    )
     
                [error] => Array
                    (
                        [image1] => 0
                    )
     
                [size] => Array
                    (
                        [image1] => 2489
                    )
     
            )
     
        [item2] => Array
            (
                [name] => Array
                    (
                        [image2] => btn_close.gif
                    )
     
                [type] => Array
                    (
                        [image2] => image/gif
                    )
     
                [tmp_name] => Array
                    (
                        [image2] => C:\Program Files\EasyPHP 3.0\tmp\php7A.tmp
                    )
     
                [error] => Array
                    (
                        [image2] => 0
                    )
     
                [size] => Array
                    (
                        [image2] => 477
                    )
     
            )
     
    )
     
    2 :
     
    Array
    (
        [item0] => Array
            (
                [name] => Array
                    (
                        [image0] => bgBulle.gif
                    )
     
                [type] => Array
                    (
                        [image0] => image/gif
                    )
     
                [tmp_name] => Array
                    (
                        [image0] => C:\Program Files\EasyPHP 3.0\tmp\php78.tmp
                    )
     
                [error] => Array
                    (
                        [image0] => 0
                    )
     
                [size] => Array
                    (
                        [image0] => 1027
                    )
     
            )
     
        [item1] => Array
            (
                [name] => Array
                    (
                        [image1] => btn_ouvirLivret.gif
                    )
     
                [type] => Array
                    (
                        [image1] => image/gif
                    )
     
                [tmp_name] => Array
                    (
                        [image1] => C:\Program Files\EasyPHP 3.0\tmp\php79.tmp
                    )
     
                [error] => Array
                    (
                        [image1] => 0
                    )
     
                [size] => Array
                    (
                        [image1] => 2489
                    )
     
            )
     
        [item2] => Array
            (
                [name] => Array
                    (
                        [image2] => btn_close.gif
                    )
     
                [type] => Array
                    (
                        [image2] => image/gif
                    )
     
                [tmp_name] => Array
                    (
                        [image2] => C:\Program Files\EasyPHP 3.0\tmp\php7A.tmp
                    )
     
                [error] => Array
                    (
                        [image2] => 0
                    )
     
                [size] => Array
                    (
                        [image2] => 477
                    )
     
            )
     
    )
    Jusque là tout vas vien mes fichiers sont pris en compte.... Alors que se passe-t-il?

  4. #4
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    il s'agit juste d'une notice, ce n'est pas grave...

    C'est tout simplement pcq tu ne test pas isset()

    Sinon c'est bizarre, ton code montre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="file" name="image0" />
    ton print_r($_FILES) devrait retourner qqch comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Array
    (
        [image0] => Array
            (
                [name] => 
                [type] => 
                [tmp_name] => 
                [error] => 4
                [size] => 0
            )
     
        [image1] => Array
            (
                [name] => 
                [type] => 
                [tmp_name] => 
                [error] => 4
                [size] => 0
            )
     
    )
    Néanmois, t'as du utiliser une fonction pour changer cet ordre, donc respecte ce que fait ta fonction et rajoute le fait qu'il y a toujours itemX avant d'atteindre l'item et t'aurais pu de notice


    testé avec ça ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
    	<input type="file" name="image0" />
    	<input type="file" name="image1" />
    	<input type="submit" />
    </form>
     
    <?php
    echo "<pre>";
    print_r($_FILES);
    echo "</pre>";
    ?>

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Merci pour votre aide à tous les deux.
    J'ai une question cependant : le code suivant n'affiche pas les données contenue dans les champs de type file :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
      echo '<pre>';
      print_r $_POST;
      echo '</pre>';
    donc il faut traiter les champs de fichiers à part car les fichiers ne font pas partie de l'Array du POST, mais existe-t-il un moyen de tout traiter en même temps (existe-t-il un array qui les regroupe ou faut il le créer soi même)?
    Merci d'avance

  6. #6
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Citation Envoyé par nina.b Voir le message
    Merci pour votre aide à tous les deux.
    J'ai une question cependant : le code suivant n'affiche pas les données contenue dans les champs de type file :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
      echo '<pre>';
      print_r $_POST;
      echo '</pre>';
    donc il faut traiter les champs de fichiers à part car les fichiers ne font pas partie de l'Array du POST, mais existe-t-il un moyen de tout traiter en même temps (existe-t-il un array qui les regroupe ou faut il le créer soi même)?
    Merci d'avance

    Et bien... tu l'as mis toi-même dans le post juste avant celui-ci

    Citation Envoyé par nina.b
    voila le résultat du print_r($FILES);
    Edit, ha ok tu l'as mal écrit... ce n'est donc probablement pas celui de PHP bien qu'il y ressemble assez fort...

    Pour celui de PHP c'est $_FILES et pour la structure, tu peux te rapporter à mon post précédent

    re edit ^^ voilà la structure, ça sera plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Array
    (
        [nom_de_linput_file] => Array
            (
                [name] => nom_de_limage.ext
                [type] => image/jpeg (ou image/gif, etc)
                [tmp_name] => ldfgsdfg876.tmp (nom du fichier temporaire se trouvant sur le serveur)
                [error] => 0 (0 = pas d'erreur)
                [size] => 1651651 (poids du fichier :))
            )

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Non, les fichiers sont volontairement séparés, donc la seule façon de rassembler les infos seraient de fusionner les 2 tableaux.
    Personnellement je te conseille de les laisser tranquilles et de les traiter séparément. La question étant : que veux-tu faire des fichiers envoyés ?

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Merci à vous deux pour votre aide
    Bon voila l'idée générale :
    J'arrive sur une page avec une combo box. Je choisit le nombre d'images à uploader. Si je choisit 1 , je créé un fieldset avec un champ nom, un champ légende et un champs fichier etc...
    Quand je soumet mon formulaire, PHP écrit les données de chaque champs dans un fichier XML et upload l'image sur le serveur (après les contrôles de sécurité qui s'imposent).
    Donc pour l'instant j'ai réussit à écrire dans mon fichier XML les champs titre (text) et légende (textarea). Reste à uploader les fichiers et à écrire le chemin vers mon image dans mon fichier XML.
    C'est pour cette raison que j'aimerais bien fusionner les 2 arrays ensemble (cela simplifierait l'écriture dans le XML)
    Pour info voila le format de mon XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <items>
    	<item>
    		<image>monimage.jpg</image> // ça je l'ai mis à la main ...
    		<titre>titre 4</titre>
    		<legende><![CDATA[Légende 4]]></legende>
    	</item>
    </items>
    Côté PHP j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    if(isset($_POST['submititems'])){
    	$processor = new XMLprocessor();
    	$processor->XMLfile = $XMLfile;
    	$processor->XMLloader();
    	foreach($_FILES as $fileinput=>$currentfileitem){
    		echo '<pre>';
    		print_r ($_FILES['image1']);
    		echo '</pre>';
    		$imgObj = new fileUploader($fileinput);		
    		$imgObj->typesValides = array('gif', 'jpeg', 'jpg', 'png');
    		$imgObj->uploadFile('../../../images/')or die($imgObj->writeErrors());
    		echo 'DONE';
    	}
    	foreach($_POST as $fieldset=>$currentitem){
    		if($fieldset != 'nbimgs'&& $fieldset != 'submititems'){
    			$itemNode = $processor->XMLaddEmptyNode('items', 'item');
    			foreach($currentitem as $fieldname=>$propval){
    				$propname = substr($fieldname, 0, strlen($fieldname)-1);
     
    				$processor->XMLaddPopulatedNode($itemNode, $propname, $propval);
    			} 
    		}
    	}
    }
    Et pour l'instant j'ai bien une erreur renvoyée par la méthode writeErrors() de la classe fileUploader car le test sur le temp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    else if(!in_array($this->uplodadFileType, $this->validTypes)){
    			$this->errors[2] = 'les fichier n\'est pas valide';
    			return false;
    		}
    Je vais donc déja voir ce qui ne marche pas de ce côté et ensuite comment ecrire les données de $_FILES dans les XML

  9. #9
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Bonjour,
    bonne nouvelle l'upload fonctionne.
    Vola le code PHP dans ma page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    foreach($_FILES as $fileinput=>$currentfileitem){
    		$imgObj = new fileUploader($fileinput);		
    		$imgObj->typesValides(array('image/gif', 'image/jpeg', 'image/jpg', 'image/png'));
    		$imgObj->uploadFile('../../../images/')or die($imgObj->writeErrors());
    		echo 'DONE';
    	}
    et pour la classe je me suis basée sur cet exemple et sue ce tuto.

    Je pense que j'ai encore pas mal de travail niveau sécurité mais le mécanisme fonctionne.

    Merci à tous les 2 pour vos réponses. A bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] Comment uploader des fichiers via formulaire en PHP
    Par gringo75011 dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2014, 08h27
  2. [Servlet] [FileUpload] Upload de fichiers via un formulaire
    Par jroman dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 08/07/2011, 10h22
  3. Réponses: 4
    Dernier message: 22/02/2008, 12h43
  4. Uploader des fichiers via ssh
    Par Michaël dans le forum Réseau
    Réponses: 3
    Dernier message: 13/05/2005, 20h47
  5. envoie de fichiers via les formulaires
    Par fabogranqi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 10/10/2004, 21h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo