upload plusieurs fichiers images

Mammouth du PHP | 620 Messages

10 juil. 2010, 09:46

Bonjour,
pour uploader une image et transferer vers ma base de données j'utilise un simple formulaire et une page de validation.
Mon formulaire :
    <form enctype="multipart/form-data" action="fileupload.php" method="post">
      <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
      Transfère le fichier <input type="file" name="monfichier" />
      <input type="submit" />
    </form>
page de validation :
<html>
<body>
<?php
$nomOrigine = $_FILES['monfichier']['name'];
$elementsChemin = pathinfo($nomOrigine);
$extensionFichier = $elementsChemin['extension'];
$extensionsAutorisees = array("jpeg", "jpg", "gif");
if (!(in_array($extensionFichier, $extensionsAutorisees))) {
    echo "Le fichier n'a pas l'extension attendue";
} else {    
    // Copie dans le repertoire du script avec un nom
    // incluant l'heure a la seconde pres 
    $repertoireDestination = dirname(__FILE__)."/";
    $nomDestination = "fichier_du_".date("YmdHis").".".$extensionFichier;

    if (move_uploaded_file($_FILES["monfichier"]["tmp_name"], 
                                     $repertoireDestination.$nomDestination)) {
        echo "Le fichier temporaire ".$_FILES["monfichier"]["tmp_name"].
                " a été déplacé vers ".$repertoireDestination.$nomDestination;
    } else {
        echo "Le fichier n'a pas été uploadé (trop gros ?) ou ".
                "Le déplacement du fichier temporaire a échoué".
                " vérifiez l'existence du répertoire ".$repertoireDestination;
    }
}
?>
</body>
</html>

Maintenant je voudrai pouvoir au lieu de n'uploader qu'une seule image en uploader 5 et que chacunes des 5 images ait son propre nom (exemple image1.jpg, image2.jpg,....
J'ai donc dans mon formulaire ajouter 4 champs supplementaires pour uploader les images.
je voudrai savoir si au niveau de ma page de validation je doit dupliquer 5 fois le code et adapaté pour chaque photos ou si il existe une solution plus simple et surtout plus rapide.
Merci de votre aide.

ViPHP
ViPHP | 1136 Messages

10 juil. 2010, 11:13

Salut ,

si tu as mis plusieurs champs input file , il te faut les transformer en tableau

<input type="file" name="monfichier" />

devient :

<input type="file" name="monfichier[]" />
<input type="file" name="monfichier[]" />
<input type="file" name="monfichier[]" />

Et évidemment au niveau POST , tu récupéres un tableau indexé , à toi de gérer le nommage de tes fichiers ..

Pour le reste google regorge d'exemples pour ton problème .

http://www.phpeasystep.com/phptu/2.html

Ch.

ViPHP
AB
ViPHP | 5818 Messages

10 juil. 2010, 20:49

Sinon tu peux te servir de cette classe

Dans ce cas il te suffirait d'écrire :
<?php require('class_upload.php');

$repertoireDestination = 'Répertoire par rapport à la racine du site';

//Déclaration de la classe
$up = new Telechargement($repertoireDestination,'form1','monfichier','controle_form');

//Extensions autorisées
$extensions = array("jpeg", "jpg");
$up->Set_Extensions_accepte ($extensions);

// en option contrôle sur les images pour vérifier que les fichiers téléchargés sont bien des images
$up->Set_Controle_dimImg();

// Choix du nom de destination (dans l'exemple ci-dessous s'appelle "ma_photo_1.jpg")
$up->Set_Nomme_fichier('ma_photo_1.jpg');

// Les fichiers suivant le premier seront incrémentés et tu auras donc pour les suivants ma_photo_2.jpg, ma_photo_3.jpg, ma_photo_4.jpg, ma_photo_5.jpg, suivi de l'extension du fichier en téléchargement.
$up->Set_Renomme_fichier('incr');

// Envoi des données et traitement de l'upload avec rechargement de la page pour éviter un multi upload en cas de rafraichissement de la page.
$up->Upload('reload');

// Récupération des messages d'information
$tab_messages = $up->Get_Tab_message();
?>
<form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?controle_form=1' ?>" method = "post">
     
      <input type="hidden" name="MAX_FILE_SIZE" value="100000"  />

      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />

                               
<input type = "submit" name = "form1" value = "Envoyez"  />    
</form>

        <?php //affichage des résultats
        if (!empty($tab_messages))
                        {
                                echo '<p>';
                                        foreach ($tab_messages as $num)
                                                {
                                                        foreach ($num as $value)
                                                        echo htmlspecialchars($value).'<br />';
                                                }
                                echo '</p>';
                        }
        ?>
 
Plus d'info dans le lien ci-dessus mais tel quel cela devrait déjà fonctionner (à condition d'avoir téléchargé la classe et d'avoir défini ton répertoire de destination). Pour que l'incrémentation de tes fichiers se passe au mieux il faut laisser le '_' avant le nombre qui sera incrémenté, c'est à dire par exemple monimage_1.jpg (éviter monimage1.jpg).
Modifié en dernier par AB le 11 juil. 2010, 13:51, modifié 2 fois.

Mammouth du PHP | 620 Messages

11 juil. 2010, 08:51

j'essai la classe mais j'ai une erreur a la ligne 6 :

Code : Tout sélectionner

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /homepages/1/d333597917/htdocs/class_upload.php on line 6
ligne 6 :
private $index_ses = 'Verif-Up=Wxz';

ViPHP
AB
ViPHP | 5818 Messages

11 juil. 2010, 13:48

J'ai édité mon précédent message. Il manquait une quote. J'ai testé et ça fonctionne sans rien modifier pour les fichiers jpg/jpeg (mais pour l'instant pas en mélangeant les fichiers jpg/jpeg et gif).

Pour ton erreur je ne comprend pas. Tu as dû faire une erreur en recopiant le code ou en incluant la classe.

Il suffit de copier la classe de ce message dans un fichier que tu nommeras "class_upload.php" et ce fichier doit être dans le même répertoire que le script qui l'appelle puisque l'on fait require('class_upload.php');

A part ça si tu as renseigné ton répertoire de destination ça doit fonctionner puisque cela marche chez moi dans ces conditions.

Mammouth du PHP | 620 Messages

11 juil. 2010, 18:34

re,
j'ai fait un copier coller et j'ai toujours le meme erreur. dès l'ouverture du fichier qui fait appel a la classe j'ai l'erreur :
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /homepages/1/d333597917/htdocs/class_upload.php on line 6
en chemin j'ai mis :
$repertoireDestination = 'upload'; sur le quel j'ai appliqué '777'

Pour info je suis sous PHP Version 4.4.9
Modifié en dernier par fabrice88250 le 11 juil. 2010, 19:58, modifié 1 fois.

ViPHP
AB
ViPHP | 5818 Messages

11 juil. 2010, 18:50

Bah c'est pas compliqué, sous le titre "La classe :" tu cliques sur "sélectionner" et tu copies TOUT sans exception. Et pareil pour l'exemple d'utilisation que je t'ai donné ci-dessus.

Ensuite compare le début des fichiers recopiés dans tes fichiers avec le code contenu sur ce forum, il ne devrait pas y avoir de différence (apparemment il y en a une pour l'instant puisque tu as ce message d'erreur).

Ou alors c'est quand tu intègre le script dans ton code que cela pose problème à un moment donné. Testes uniquement avec ces deux fichiers pour voir.

Mammouth du PHP | 620 Messages

11 juil. 2010, 20:10

c'est se que je pense avoir fait :
j'ai donc un fichier que j'ai appelé ab.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>


<?php require('class_upload.php');

$repertoireDestination = 'upload';

//Déclaration de la classe
$up = new Telechargement($repertoireDestination,'form1','monfichier','controle_form');

//Extensions autorisées
$extensions = array("jpeg", "jpg");
$up->Set_Extensions_accepte ($extensions);

// en option contrôle sur les images pour vérifier que les fichiers téléchargés sont bien des images
$up->Set_Controle_dimImg();

// Choix du nom de destination (dans l'exemple ci-dessous s'appelle "ma_photo_1.jpg")
$up->Set_Nomme_fichier('ma_photo_1.jpg');

// Les fichiers suivant le premier seront incrémentés et tu auras donc pour les suivants ma_photo_2.jpg, ma_photo_3.jpg, ma_photo_4.jpg, ma_photo_5.jpg, suivi de l'extension du fichier en téléchargement.
$up->Set_Renomme_fichier('incr');

// Envoi des données et traitement de l'upload avec rechargement de la page pour éviter un multi upload en cas de rafraichissement de la page.
$up->Upload('reload');

// Récupération des messages d'information
$tab_messages = $up->Get_Tab_message();
?>
<form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?controle_form=1' ?>" method = "post">
     
      <input type="hidden" name="MAX_FILE_SIZE" value="100000"  />

      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />

                               
<input type = "submit" name = "form1" value = "Envoyez"  />    
</form>

        <?php //affichage des résultats
        if (!empty($tab_messages))
                        {
                                echo '<p>';
                                        foreach ($tab_messages as $num)
                                                {
                                                        foreach ($num as $value)
                                                        echo htmlspecialchars($value).'<br />';
                                                }
                                echo '</p>';
                        }
        ?>
 
 
</body>
</html>

puis un autre fichier pour la classe que j'ai donc nommé class_upload.php ou j'ai fais un cipoer coller de ta class (je peu pas la mettre ici car on me dit que j'utilise trop de caractères

ViPHP
AB
ViPHP | 5818 Messages

11 juil. 2010, 21:10

Normalement ce serait plutôt ceci :
<?php 

require('class_upload.php');

$repertoireDestination = 'upload';

//Déclaration de la classe
$up = new Telechargement($repertoireDestination,'form1','monfichier','controle_form');

//Extensions autorisées
$extensions = array("jpeg", "jpg");
$up->Set_Extensions_accepte ($extensions);

// en option contrôle sur les images pour vérifier que les fichiers téléchargés sont bien des images
$up->Set_Controle_dimImg();

// Choix du nom de destination (dans l'exemple ci-dessous s'appelle "ma_photo_1.jpg")
$up->Set_Nomme_fichier('ma_photo_1.jpg');

// Les fichiers suivant le premier seront incrémentés et tu auras donc pour les suivants ma_photo_2.jpg, ma_photo_3.jpg, ma_photo_4.jpg, ma_photo_5.jpg, suivi de l'extension du fichier en téléchargement.
$up->Set_Renomme_fichier('incr');

// Envoi des données et traitement de l'upload avec rechargement de la page pour éviter un multi upload en cas de rafraichissement de la page.
$up->Upload('reload');

// Récupération des messages d'information
$tab_messages = $up->Get_Tab_message();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<div>
<form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?controle_form=1' ?>" method = "post">
     <p>
      <input type="hidden" name="MAX_FILE_SIZE" value="100000"  />

      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />
      <input type="file" name="monfichier[]" /><br  />

                               
<input type = "submit" name = "form1" value = "Envoyez"  />   
 </p> 
</form>

        <?php //affichage des résultats
        if (!empty($tab_messages))
                        {
                                echo '<p>';
                                        foreach ($tab_messages as $num)
                                                {
                                                        foreach ($num as $value)
                                                        echo htmlspecialchars($value).'<br />';
                                                }
                                echo '</p>';
                        }
        ?>
 
 </div>
</body>
</html>
Essaies cela mais cela ne devrait pas venir de ça. Si ça ne change rien c'est que tu as un problème dans le code de la classe que tu as recopié dans class_upload.php. Tu n'as pas oublié les balises <?php au début et ?> à la fin dans le code de la classe ?

Mammouth du PHP | 620 Messages

11 juil. 2010, 21:21

Désolé sa ne fonctionne toujours pas meme avec le nouveau code pour le forumaire.
concernant la classe c'est un copier coller et j'ai bien les balises php... Je comprend pas

ViPHP
AB
ViPHP | 5818 Messages

11 juil. 2010, 21:29

Ah oui par rapport à mon message précédent j'ai oublié de dire au cas où, que dans le fichier class_upload.php il doit n'y avoir que le code de la classe et RIEN d'autre.

Mammouth du PHP | 620 Messages

11 juil. 2010, 21:53

Je viens de regardé et je n'ai rien d'autre du tout dans le fichier. j'avais un espace en bas de page après le ?> mais même en le supprimant j'ai toujours ce même message.
comme je comprend pas le pourquoi sa fonctionne chez toi et pas chez moi voici les 2 fichiers : lien

ViPHP
AB
ViPHP | 5818 Messages

11 juil. 2010, 22:29

Bon ben alors à la place de require('class_upload.php'); dans ton script tu mets le code de la classe. Par contre comme la balise d'ouverture <?php et de fermeture ?> est déjà présente dans ton script, il ne faut pas recopier ces balises qui sont dans le code de la classe.

ça donne quoi ?

Mammouth du PHP | 620 Messages

11 juil. 2010, 22:33

j'ai toujours la même erreur sur la ligne
private $index_ses = 'Verif-Up=Wxz';
Alors j'ai essayé de supprimé cette ligne juste pour voir et meme en la supprimant j'ai toujours le meme message d'erreur.

ViPHP
AB
ViPHP | 5818 Messages

11 juil. 2010, 22:43

Montre les 10 premières lignes de ta page.

Tu travailles avec quelle version de php ?