inclure une boucle dans l uplaod de fichier de AB

Eléphant du PHP | 65 Messages

31 janv. 2011, 20:34

Bonjour à tous ,
voila j utilise le fichier de AB pour l upload d image et je voudrai y integer une boucle qui pour pourvoir upload plusieur image mais je vois pas trop comment ni ou la metre

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 janv. 2011, 20:53

hum, de mémoire l'upload multiple est prévu nan ?

c'est en tous cas ce qu'indique la doc.

Il faut pour cela que tu indique un nom de "input" utilisant la syntaxe tableaux.

Par exemple <input type="file" name="fichiers[]" /> tu utilise cette balise plusieurs fois et dans la validation tu passe fichier comme nom et il doit se démerder seul.


@+
Il en faut peu pour être heureux ......

ViPHP
AB
ViPHP | 5818 Messages

31 janv. 2011, 21:10

Oui comme dit moogli c'est un peu l'intérêt d'une classe que de pouvoir gérer différentes configurations.

Donc la gestion de téléchargement de plusieurs images est expliquée dans le premier formulaire de cet exemple

Si tu as des problèmes montres nous ton formulaire avec les données que tu veux récupérer.

Eléphant du PHP | 65 Messages

31 janv. 2011, 21:48

bon je vous montre le code:
<?php
header('Content-type: text/html; charset=UTF-8');

session_start();



// Fonction de renommage : si fichier.ext existe, renomme en fichier1.ext ;  si fichier1.ext existe, renomme en fichier2.ext etc..
function Rename_fich($adresse_fichier)

    {
      //Si le fichier existe et est un fichier valide
      if (is_file($adresse_fichier))
              {
				 
 
                  // Informations sur le fichier
                  $info = pathinfo($adresse_fichier);
                  $extension = $info['extension'];
                  $filename = $info['filename'];
                  $dossier = $info['dirname'];
 
                  // Cherche dans le nom de fichier des caractères numériques en fin de nom et si oui incrémente ce nombre grâce à la fonction anonyme create_function
                  $filename = preg_replace_callback('#([0-9]+$)#', create_function('$matches','return $matches[1]+1;'), $filename, '1', $count);
                                 
                  // Si des caractères numériques sont trouvés et incrémentés (le paramètre $count employé dans preg_replace_callback indique le nombre de remplacements), $filename prend sa nouvelle valeur, sinon l'ancienne concaténée à 1
                  $filename = !empty($count)? $filename : $filename.'1';
                                 
                  // Reconstruction du nom de fichier avec son extension (si elle existe)
                  $filename = !empty($extension) ? $filename.'.'.$extension : $filename;
                                 
                  // Reconstruction de l'adresse du fichier
                  $adresse = $dossier.'/'.$filename;
                                 
                  // Appel de la fonction pour re vérification avec le nouveau nom du fichier
                  return Rename_fich($adresse);
                                 
              }
                         
      // Retourne le chemin complet du fichier      
      else return $adresse_fichier;
    }




// Fonction qui interromp le script et recharge la page
function Reload_page ()

    {
        header("Location:".$_SERVER['PHP_SELF']);
        exit;  
    }




// Fonction permettant de convertir une chaine de caractère en octets  ex : "1K" est converti en "1024" (car 1 kilo octet = 1024 octets)
function Return_Octets($val)
    {
        $val = trim($val);
        $last = strtolower($val[strlen($val)-1]);

        switch($last)
            {
                case 'g':  $val *= 1024;
                case 'm': $val *= 1024;
                case 'k':  $val *= 1024;
            }

        return $val;
    }




// Si le fichier dépasse la taille maximum du POST autorisée par le serveur - correspond à la valeur ini_get('post_max_size') - les tableaux $_POST et $_FILES seront vides. Néanmoins la variable GET['form_file'] envoyée en même temps que le formulaire est récupérée. Donc si la première valeur n'existe pas mais que la seconde existe, nous sommes dans ce cas de figure.



if(!isset($_POST['chargement']) && isset($_GET['form_file']))
		
	 {
		 
        $_SESSION['resultat_telecharg'] = 'Fichier non téléchargé. Le fichier dépasse la taille maximum du POST autorisée par le serveur.';
                                 
        Reload_page ();
    }

    

// Téléchargement du fichier vers le serveur si les variables du formulaire sont transmises
if (isset($_POST['chargement'],$_FILES['userfile']['name']) && trim($_FILES['userfile']['name']) != '')

    {
	
        // Répertoire de destination par rapport à la racine du site, exemple PHOTO
       $repertoire = 'arf/testphoto';
           
        // Tableau des extensions de fichier autorisées
        $extensions_ok = array('png','jpg','jpeg','gif');



        // Initialisation de la variable affichant le message de résultat du téléchargement
        $_SESSION['resultat_telecharg'] = null;    


        // Gestion des erreurs c.f. <a href="http://www.php.net/manual/fr/features.file-upload.errors.php" class="postlink" onclick="window.open(this.href); return false;">ce lien</a>  
        switch ($_FILES['userfile']['error'][$i])
                {
                        case "1" : $_SESSION['resultat_telecharg'] = "Le fichier excède la taille de fichiers autorisée  par le serveur";break;
                        case "2" : $_SESSION['resultat_telecharg'] = "Le fichier excède la taille de fichiers autorisée  dans le formulaire";break;
                        case "3" :
                        case "4" :
                        case "6" :
                        case "7" :
                        case "8" : $_SESSION['resultat_telecharg'] = "Fichier non téléchargé. Problème lors du téléchargement";break;
               }

        // Si le fichier n'est correctement chargé on sort du script
        if ($_FILES['userfile']['error'] !== 0) Reload_page ();



        // Adresse racine du serveur
        $adresse = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ;
           
        // Adresse du répertoire de destination
        $destination = $adresse.$repertoire.'/';      
               
        // Vérification de la validité du répertoire, si non valide (signifié par "!is_dir") on sort du script en ayant enregistré un message d'erreur
        if (!is_dir($destination))
                       
                {
                        $_SESSION['resultat_telecharg'] = 'Chemin du dossier non valide';
                                 
                        Reload_page ();
                }
               
       
        // Nom du fichier téléchargé
        $localfile = $_FILES['userfile']['name'];
           $localfile = $_FILES['userfile']['name'];
        // Trouve l'extension du fichier et la met en minuscules
        $extension = strtolower(substr($localfile,strrpos($localfile, ".")+1));
       
        // Vérification que l'extension est contenue dans le tableau des extensions autorisées. Dans le cas contraire (signifié par "!in_array") on sort du script en ayant enregistré un message d'erreur.  
        if (!in_array($extension,$extensions_ok))
           
                {
                        //Transforme le tableau en chaine de caractères séparés par une virgule suivie d'un espace pour affichage dans le message d'erreur
                        $extensions_autorisees = implode(', ',$extensions_ok);
                                           
                        // Message d'erreur d'extension du fichier
                        $_SESSION['resultat_telecharg'] = 'Extension du fichier non autorisée. Extensions autorisées : '.$extensions_autorisees.'.';
                                 
                        Reload_page ();                                          
                }
       
       
        // Remplacement des caractères accentués par leur équivalent
        $nom_fichier = iconv('UTF-8', 'ASCII//TRANSLIT', $localfile);
        // Nettoyage des caractères non valides (reste les caractères alphanumériques et '.', '_', '-')
        $nom_fichier = preg_replace('#[^.a-z0-9_-]+#i', '', $nom_fichier);
       
        // Si après traitement le résultat est une chaine vide, on renregistre un message d'erreur et on sort du script  
        if (trim($nom_fichier) == '')                    
                {
                        $_SESSION['resultat_telecharg'] = 'Nom de fichier non valide. Veuillez renommer votre fichier avant le téléchargement';
                                 
                        Reload_page ();
                }        

        // Adresse du fichier de destination
        $adresse_fichier = $destination.$nom_fichier;
           
        // Application de la fonction "Rename_fich" pour  vérifier l'existence d'un fichier de même nom dans le répertoire et si oui, renommage du fichier de téléchargement
        $adresse_fichier = Rename_fich($adresse_fichier);
       
                 
        // Si chargement du fichier - avec le nom temporaire créé par le serveur - vers l'adresse de destination
   if(@move_uploaded_file($_FILES['userfile']['tmp_name'], $adresse_fichier))                                                                                                                                       
                {
                        // Nom du fichier final
                        $nom_fichier = basename($adresse_fichier);
       
                        // Préparation des messages de confirmation
                        $resultat1 = 'Le fichier "'.$localfile.'" a été téléchargé sur le serveur';
                        $resultat2 = 'Le fichier "'.$localfile.'" renommé "'.$nom_fichier.'" a été téléchargé sur le serveur';
                                               
                        // Création du message de confirmation
                        $_SESSION['resultat_telecharg'] = $localfile === $nom_fichier ?  $resultat1 : $resultat2;
                }
                           
                else
       
                {
                      // Le fichier n'a pas été téléchargé on sort du script en ayant enregistré un message d'erreur.
                      $_SESSION['resultat_telecharg'] = 'Fichier non téléchargé. Problème lors du téléchargement';
                                         
                      Reload_page ();
                }  
       
       
         //Recharge la page pour éviter un nouveau téléchargement en cas de rafraichissement de la page
         Reload_page ();            
    }
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Exemple téléchargement avec renommage des fichiers si déjà existants</title>
<script type="text/javascript">
<!--
function Verif_attente(id_file,id_attente)
    {
        var id_file = document.getElementById(id_file);
               
        if (typeof id_file != 'undefined' && id_file.value == '') return false;
               

        var id_attente = document.getElementById(id_attente);
       
        if (typeof id_attente != 'undefined')
        {
            // Nettoyage de l'élément cible
            var nb_noeuds = id_attente.childNodes.length;
            for (var i = 0; i < nb_noeuds; i++)        
                    {                                  
                           id_attente.removeChild(id_attente.firstChild);
                    }
               

            var texte = 'Patientez...';
            // Création du noeud texte
            var noeud_texte = document.createTextNode(texte);
            // Insertion du noeud texte
            id_attente.appendChild(noeud_texte);
               
        }
    }
-->
</script>

		<script language="javascript">
			var nb = 0;
			function add_input(){
				nb++;
				var div = document.getElementById('form_inputs');
				input = document.createElement("input");
				br = document.createElement("br");
				input.setAttribute("type", "file");
				input.setAttribute("name", 'userfile' + nb);
				div.appendChild(input);
				div.appendChild(br);
			}
		</script>
</head>

<body>
        <div id = "message_tele"><?php if (isset($_SESSION['resultat_telecharg'])) {echo  htmlspecialchars($_SESSION['resultat_telecharg']); unset($_SESSION['resultat_telecharg']);}?>
        </div>
               
      <div id="form_inputs">  <form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?form_file=2'?>" method = "post" onsubmit = "Verif_attente('userfile','message_tele')">
        <p>
        <input type = "hidden" name = "chargement" value = "1"/>
       
        <!-- Vous pouvez spécifier dans l'input "MAX_FILE_SIZE" la taille maximum que vous autorisez avec la fonction Return_Octets qui convertira votre valeur en octets.
        exemples : Return_Octets('2M') pour indiquer 2 méga octets, Return_Octets('500K') pour 500 kilos octets, Return_Octets('1G') pour un giga octet ...
        Cette valeur doit être inférieure ou égale à ini_get('upload_max_filesize') définie par le serveur -->

        <input type = "hidden" name = "MAX_FILE_SIZE"  value = "<?php echo Return_Octets(ini_get('upload_max_filesize'))?>" />
       
        <input id = "userfile " name = "userfile[]" type = "file" size = "20" />
         <input type="button" value="Ajouter une autre image" onClick="add_input()"/>
        <input type = "submit" value = "Envoyez"  style = "margin-left:5px" />
        </p>
        </form>
        </div>
        <p>Taille maximum par fichier autorisée par le serveur = <?php echo ini_get('upload_max_filesize').'o'?></p>
               
</body>
</html>
Donc j ai ajouter les crochet à userfile mais je pense qu il doit manquer un truck comme une boucle dans se genre là
for (var i=0; i<n; i++)
par exemple pour faire plus d uplaod .
car pour le moment même avec les crochet de userfile il n inser que la premiére image et pas la seconde
Je n'utilse pas la classe mais le premier tuto de AB
merci

ViPHP
xTG
ViPHP | 7331 Messages

31 janv. 2011, 22:13

Le tutorial n'est fait que pour un seul fichier.
Et tu as moultes modifications pour l'adapter pour plusieurs. ;)

Consultes plutôt la class.

Eléphant du PHP | 65 Messages

31 janv. 2011, 22:31

moulte modification ? je pensais que sa serai plus simple que sa c est pour adapter àun de mes site qui n utilise pas de class donc mettre une class c est pas too mutch?

ViPHP
AB
ViPHP | 5818 Messages

31 janv. 2011, 22:47

Nan... utilises la classe ! CE SERA BEAUCOUP PLUS SIMPLE

Pourquoi vouloir t'en priver, et pour moi c'est bien plus facile de t'expliquer le fonctionnement de la classe plutôt que le téléchargement de fichiers multiples. Surtout qu'ensuite tu risque fort de me demander d'autres fonctions complémentaires qui sont aussi inclues dans la classe...

Et puis tu pourras facilement réutiliser cette classe dans d'autres script alors qu'avec le code en dur, faudrait modifier pas mal de trucs....

Eléphant du PHP | 65 Messages

31 janv. 2011, 22:56

bon il ne me reste plus qu à tester ta class et faire la refonte totale à base de class dur boulot en perspective lol!!! Mon petit site à base de codage simple modifier depuis php4 pour rester compatible va devoir subire les foudres des class merci pour l info à tous

ViPHP
AB
ViPHP | 5818 Messages

31 janv. 2011, 23:01

Mais non justement y'aura certainement pas de refonte à faire !!! pour peu que ton serveur accepte php >= 5.1 (de toutes façons le tuto c'est php >=5.2)

Montre simplement le formulaire html que tu veux faire et uniquement le formulaire (pour l'instant).

EDIT : une classe n'est en gros qu'une collection de fonctions protégées et n'impacte en rien le reste de ton code.

Eléphant du PHP | 65 Messages

31 janv. 2011, 23:09

bon voila le formulaire classique j ai ajouter le champ photo que je voulais intégrer
<table cellspacing="4" cellpadding="0">
  <tr>
    <td>Nom  :</td>
    <td><input name="name" type="text" size="35" /></td>
  </tr>
  <tr>
    <td>Photo</td>
    <td><input name="urserfile" type="file" value=""/></td>
  </tr>
  <tr>
    <td valign="top">Email :</td>
    <td><input name="email" type="text" size="35" /></td>
  </tr>  
  <tr>
    <td valign="top">Catégorie :</td>
    <td>
<select>
Mes cat en php avec une boucle
</select>

	</td>
  </tr>
  <tr>
    <td>Description :</td>
    <td><textarea name="description" cols="70" rows="4"></textarea></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>  
  </tr>
  <tr>
   <td><input value="R&eacute;initialiser" type="reset" /></td>
   <td><input value="Soumettre" type="submit" /></td>
  </tr>
</table>	</form>
pour le moment c est encore a base de tableaux mais je n aurai aucun problem a passer en div ,css mais pour l exemple un problém a la fois
merci AB (je me voyais pas tous recoder en class)

ViPHP
AB
ViPHP | 5818 Messages

31 janv. 2011, 23:51

Voilà tu vois c'est assez simple. Je t'ai mis deux champs photo mais tu pourrais en mettre plus.

Pour que cela fonctionne il faut que tu enregistre le code de la classe et que tu le recopie dans un fichier nommé 'Classe_Upload.php5' puisqu'en première ligne on fait require('Classe_Upload.php5');

Ensuite il te suffit de donner le nom de destination dans $dossier_destination
<?php
require('Classe_Upload.php5');

$dossier_destination = 'Alainbweb/Test';// Indique simplement ton dossier de destination

//Déclaration de la classe avec ses paramètres cf mode d'emploi de la classe
$form_photo = new Telechargement($dossier_destination,'formulaire_photo','urserfile','formulaire');

// Tableau des extensions autorisées (en minuscules). Dans cet exemple, seules les extensions "jpg" et "jpeg" sont autorisées
$tab_extensions_autorisees = array('jpg','jpeg');
// Envoi du tableau des extensions autorisées
$form_photo->Set_Extensions_accepte($tab_extensions_autorisees);


// Option contrôle de l'existence d'un fichier de nom identique dans le répertoire de destination et si oui renommage  du fichier téléchargé avec un suffixe incrémentiel.
$form_photo->Set_Renomme_fichier ('incr');//enlève cette ligne si tu n'effectue pas ce contrôle mais si un fichier de même nom existe déjà il sera écrasé


// Téléchargement sans reload de la page
$form_photo->Upload ();

if (isset($_POST['formulaire_photo']))
        {
       
                //Récupération du tableau des résultats de l'upload pour éventuellemnt les passer en bdd
                $transfert_form_photo = $form_photo->Get_Tab_upload ();
               
				
				//Ici dessous tu récupère tes autres post "name", "email" etc.
				//...
				
				
				// A la fin on recharge la page pour éviter des téléchargments multiples
                $form_photo->Get_Reload_page();
               
        }

//Récupération des messages d'information de l'upload
$messages_form_photo = $form_photo->Get_Tab_message ();

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.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>
<script type="text/javascript">
<!--
function Verif_attente(id_attente)
    {              
        var id_attente = document.getElementById(id_attente);
       
        if (typeof id_attente != 'undefined')
        {
            // Nettoyage de l'élément cible
            var nb_noeuds = id_attente.childNodes.length;
                       
            for (var i = 0; i < nb_noeuds; i++)        
                                {                                  
                                        id_attente.removeChild(id_attente.firstChild);
                                }
			
			id_attente.style.fontWeight="bold";
	    	id_attente.style.fontSize="1.5em";
			
            var texte = 'Patientez...';
            // Création du noeud texte
            var noeud_texte = document.createTextNode(texte);
            // Insertion du noeud texte
            id_attente.appendChild(noeud_texte);
        }
    }
-->
</script>

</head>

<body>
<form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?formulaire=1'?>" method = "post" onsubmit = "Verif_attente('message_tele')" id = "formulaire">
<table cellspacing="4" cellpadding="0">
  <tr>
    <td>Nom  :</td>
    <td><input name="name" type="text" size="35" /></td>
  </tr>
  <tr>
    <td>Photo</td>
    <td>
	<input type = "hidden" name = "formulaire_photo" value = "1" />
	<input name="urserfile[]" type="file" value=""/>
	<input name="urserfile[]" type="file" value=""/>
	</td>
  </tr>
  <tr>
    <td valign="top">Email :</td>
    <td><input name="email" type="text" size="35" /></td>
  </tr>  
  <tr>
    <td valign="top">Catégorie :</td>
    <td>
<select>
Mes cat en php avec une boucle
</select>

        </td>
  </tr>
  <tr>
    <td>Description :</td>
    <td><textarea name="description" cols="70" rows="4"></textarea></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>  
  </tr>
  <tr>
   <td><input value="R&eacute;initialiser" type="reset" /></td>
   <td><input value="Soumettre" type="submit" /></td>
  </tr>
</table>        
</form>
<!--Résultat du téléchargement-->
    <div id = "message_tele" style="margin-top:20px;">
               
                <?php if (!empty($messages_form_photo))
           
                foreach ($messages_form_photo as $num)
                        {
                                foreach ($num as $value)
                                echo htmlspecialchars($value).'<br />';
                        }
                ?>
    </div>
</body>
</html>
Et ensuite par exemple il suffit d'une ligne à ajouter pour effectuer un redimensionnement pour les images, ou une autre ligne pour imposer un nom au fichier téléchargé etc.

Eléphant du PHP | 65 Messages

01 févr. 2011, 11:50

merci beaucoup AB je vais tester tous sa.Puis je inclure mon petit script java avec add input et definir un nombre maxi pour les photos?

ViPHP
AB
ViPHP | 5818 Messages

01 févr. 2011, 16:32

Puis je inclure mon petit script java avec add input et definir un nombre maxi pour les photos?
Il n'y a aucun problème.
Il suffit que les champs que tu ajoute en javascript aient comme nom 'urserfile[]' puisque c'est le nom que j'ai indiqué en troisième paramètre dans l'initialisation de la classe comme le champ de type file (cf mode d'emploi) :
$form_photo = new Telechargement($dossier_destination,'formulaire_photo','urserfile','formulaire');
En fait j'ai indiqué 'urserfile' mais la classe se débrouille toute seule pour récupérer le champ de type file nommé 'urserfile' ou les différents champs de type file nommés 'urserfile[]'.
Même pour un seul champ tu peux écrire 'urserfile[]' dans ton code html, donc tu peux en écrire un puis ensuite en rajouter d'autres avec un code javascript.

Eléphant du PHP | 65 Messages

01 févr. 2011, 16:38

merci AB tu as oublier de répondre si je veux par exemple limiter un nombre de input je le limite dans le java ou dans la class? trop cool faut vraiment que je me mette au class y a pas de doute lol!!! si tu as un bon tuto sous la main suis preneur

merci encore pour la mine d info

ViPHP
AB
ViPHP | 5818 Messages

01 févr. 2011, 20:27

merci AB tu as oublier de répondre si je veux par exemple limiter un nombre de input je le limite dans le java ou dans la class?
Ben dans le code javascript puisque la classe chargera tous les champs nommés 'urserfile[]' quelque soit leur nombre (et les champs vides seront ignorés).

Et donc ton titre est erroné car il n'y a pas besoin de faire de boucle puisque la classe s'en charge automatiquement si besoin :wink: