Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/05/2007, 12h19   #1
Invité régulier
 
Inscription : août 2004
Messages : 31
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 31
Points : 8
Points : 8
Par défaut [Upload] Upload de photos (déjà svt traité, mais suis coincé !)

Bonjour,
j'ai lu de très nombreux articles et forums au sujet de l'upload de fichiers, mais maintenant, je suis coincé.
Alors je viens voir si quelqu'un de plus malin que moi pourra me venir en aide.

Ce qui me chiffonne : le premier fichier est correctement uploadé (le programme fonctionne donc), mais les autres ne le sont pas !!!!
Pourquoi ????

Page d'appel:

Code HTML :
1
2
3
4
5
6
7
 
<form action="control_upload_4.php" method="post" enctype="multipart/form-data">
<input type="file" name="fichattach[]" />
<input type="file" name="fichattach[]" />
<input type="file" name="fichattach[]" />
<input type="submit" value="Send" />
</form>

Page d'upload:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
 
$DIRDEST='/photos_up/';
if (isset($fichattach))
  {   foreach($fichattach as $Key => $Value)   
      {echo "111  ".$_FILES['fichattach']['tmp_name'][$Key ]."<br>";
       echo "222  ".$_FILES['fichattach']['name'][$Key ]."<br>";
       echo "333  ".$_FILES['fichattach']['type'][$Key ]."<br>";
       echo "444  ".$_FILES['fichattach']['size'][$Key ]."<br>";       
 
       $DIRDEST = getcwd().$DIRDEST; // dossier où sera déplacé le fichier       
       $tmp_file = $_FILES['fichattach']['tmp_name'][$Key ];
       if( !is_uploaded_file($tmp_file) )          
           { echo("Le fichier est introuvable"."<br>"); }       
       // on copie le fichier dans le dossier de destination       
       $name_file = $_FILES['fichattach']['name'][$Key ];
       if( !move_uploaded_file($tmp_file, $DIRDEST . $name_file) )          
           {echo("Impossible de copier le fichier dans ".$DIRDEST."<br>");  }	   
       else	      
            {$res2=chmod ($DIRDEST . $name_file, 0777);
             //echo "fichier ".$_FILES['fichattach']['name'][$Key ]." uploadé <br>";		
       }	
}
}
J'avoue que je ne comprends pas pourquoi ça marche UNE fois et pas deux !

Merci d'avance pour n'importe quelle idée qui fera avancer le machin!

Mike
mikeduff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2007, 13h30   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Vous mélanger deux écritures différentes avec/sans register_globals actif. D'après votre code cet extrait me semble plus cohérent :
Code :
1
2
if (isset($_FILES['fichattach']))
  {   foreach($_FILES['fichattach'] as $Key => $Value)
Le parcours du tableau est incorrect :
Code :
for ($Key = 0, $c = count($_FILES['fichattach']['name']); $Key < $c; $Key++) {
Pour remplacer le foreach.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2007, 15h58   #3
Invité régulier
 
Inscription : août 2004
Messages : 31
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 31
Points : 8
Points : 8
Bonjour Julp,

merci de ta réponse rapide.
En ce qui concerne ta première remarque (mélange des variables GlobalSystems et locales), tout-à-fait d'accord: manque de cohérence (mais sans conséquence sur le fonctionnement du programme; j'ai n"anmoins corrigé)

Par contre, je ne pense pas que le remplacement de la boucle "foreach" par la boucle "for" change quoi que ce soit: la première s'exécutait fort bien dans sa totalité: le "echo" de débugging, que j'avais supprimé dans le post, prouve bien son exécution complète et avec les bons noms de fichiers.

Néanmoins, pour toute certitude, et faisant foi de ta grande expérience, j'ai procédé au remplacement de ma boucle par ta proposition. Malheureusement, avec exactement le même résultat: boucle exécutée complètement, mais seul le premier fichier est uploadé.

La question reste donc entière: Pourquoi ????

Merci encore pour toute aide
Mike
mikeduff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2007, 16h37   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par mikeduff
Par contre, je ne pense pas que le remplacement de la boucle "foreach" par la boucle "for" change quoi que ce soit: la première s'exécutait fort bien dans sa totalité: le "echo" de débugging, que j'avais supprimé dans le post, prouve bien son exécution complète et avec les bons noms de fichiers.
Si justement puisque le tableau $_FILES se présente sous la forme suivante :
Code X :
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
Array
(
    [fichiers] => Array
        (
            [name] => Array
                (
                    [0] => X.png
                    [1] => Y.php
                )
            [type] => Array
                (
                    [0] => application/octet-stream
                    [1] => application/octet-stream
                )
            [tmp_name] => Array
                (
                    [0] => /tmp/php14.tmp
                    [1] => /tmp/php15.tmp
                )
            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                )
            [size] => Array
                (
                    [0] => 44847
                    [1] => 436
                )
        )
)
Et non :
Code X :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Array
(
    [fichiers] => Array
        (
            [0] => Array
                (
                    [name] => X.png
                    [type] => application/octet-stream
                    [tmp_name] => /tmp/php14.tmp
                    [error] => 0
                    [size] => 44847
                )
            [1] => Array
                (
                    [name] => Y.php
                    [type] => application/octet-stream
                    [tmp_name] => /tmp/php15.tmp
                    [error] => 0
                    [size] => 436
                )
        )
)
En développant avec error_reporting à E_ALL vous auriez tout de suite vu qu'il y avait un problème.

La deuxième partie du problème provient de $DIRDEST qui est faux dès la deuxième itération à cause de la concaténation.
Supprimer :
Code :
$DIRDEST = getcwd().$DIRDEST; // dossier où sera déplacé le fichier
Et modifier :
En (par exemple) :
Code :
$DIRDEST = realpath('./upload/');
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 18h40   #5
Invité régulier
 
Inscription : août 2004
Messages : 31
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 31
Points : 8
Points : 8
Bonjour Julp,

Nous ne serons pas d'accord sur tout, mais je ne peux pas t'en vouloir car tu as bel et bien résolu le problème:

il se trouvait dans la modification à chaque tour de boucle de la variable $DIRDEST. En fait, cette commande s'est retrouvée dans la boucle, je sais pas trop comment sans que je m'en aperçoive.
Je suppose que j'étais tellement persuadé que le problème était lié à la technique d'upload (qui m'avait déjà pas mal fait galérer), que ce qui aurait dû m'être évident m'a échappé.
Bref, il m'a suffit de replacer le "$DIRDEST=...." avant la boucle, et tout est rentré dans l'ordre.

Ce qui m'amène au second point: la boucle "Foreach" telle que je l'avais proposée fonctionne parfaitement (maintenant ).
Il est vrai que les variables d'array ne prennent pas tout à fait la même valeur, comme tu le soulignes, mais c'est sans importance, les 2 versions semblent équivalentes (à moins que qqch m'échappe, bien sûr)

Voilà. En tout cas merci beaucoup du coup de main.
mikeduff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h49.


 
 
 
 
Partenaires

Hébergement Web