Uploads multiple

Signaler
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019
-
jordane45
Messages postés
27660
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2020
-
Bonjour,

J'utilise la classe 'upload' que j'ai pu récupérer ici :

http://codes-sources.commentcamarche.net/source/51794-class-upload-de-fichier-en-php#q=upload+class&cur=4&url=

lors de l'envoi du formulaire avec une photo, tout va bien. Mais je souhaiterai donner la possibilité aux abonnés d'alimenter un portfolio <- donc qu'ils puissent uploader un max de 9 photos, donc :

Puis je instancier mon objet Upload dans une boucle, au lieu de faire l'instanciation manuellement pour chaque 'name' de chaque input?

Voici mon code :


<div class="up">
<label for="photo2">Photo 2</label>
<input type="file" name="photo2" />
</div>
<div class="up">
<label for="photo3">Photo 3</label>
<input type="file" name="photo3" />
</div>
<div class="up">
<label for="photo4">Photo 4</label>
<input type="file" name="photo4" />
</div>

ETC ...

et pareil pour l'instanciation ...

$objet = new upload('../images/','photo2'); // **

$objet->cl_taille_maxi = 2097152;
$objet->cl_extensions = array('.gif','.jpg','.png'); // les extensions autorisées
$objet->uploadFichier('aleatoire');
$ext=$objet->cGetExtension();
$nomdufichier=$objet->cGetNameFile(true);
$nomdestination=$objet->cGetNameFileFinal(true);
$pic=$nomdestination;
$explode= explode(".",$pic);
$photo=$explode[0];
$ext=$explode[1];

Je bloque complétement ...
--

9 réponses

Messages postés
27660
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2020
324
Bonjour,

Un truc du genre :


 for($i=1;$i<=9;$i++){
 if(isset($_POST['photo'.$i])){
   echo "<br>".$_POST['photo'.$i]." => ".UploadFile('../images/',$_POST['photo'.$i]);
 }
}
 
 function UploadFile($rep,$file){
  $obj = new upload($rep, $file);
 // on déclare les variables qu'on a besoin
 $obj->cl_taille_maxi = 49000000; // pour 49 Mo maximum
 $obj->cl_extensions = array('.gif','.jpg','.png'); // les extensions autorisées
  // on envoi le fichier
  if (!$obj->uploadFichier()){
   // affichage d'une erreur en cas d'echec
   $msg = $obj->affichageErreur();
  }else{
   $msg="ok";
  }
return $msg;
}


Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019

Merci pour ton aide, je vais tester ! j'espère ne pas paraitre "idiote", mais comment je gère le input multiple dans ce cas ?

--
jordane45
Messages postés
27660
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2020
324
Ben là je suis parti du principe que tu avais Plusieurs input (comme dans ce que tu as mis en exemple) nommés : photo2 , photo3 ..

Sinon, si tu veux faire du multiple (sans en connaitre le nombre avant par exemple) c'est le même principe que pour les checkbox.. il faut utiliser un Array pour les nommer.
Exemple :
<input name="xyz[]" value="Lorem" />
<input name="xyz[]" value="ipsum"  />
<input name="xyz[]" value="dolor" />
<input name="xyz[]" value="sit" />
<input name="xyz[]" value="amet" />


ce qui, pour toi, donnereait des noms du genre :
<div class="up">
    <label for="photo3">Photo 2</label>
    <input type="file" name="photo[]" />
</div>
<div class="up">
    <label for="photo3">Photo 3</label>
    <input type="file" name="photo[]" />
</div>


et dans ton code PHP, lorsque tu récupères les valeurs $_POST il faut le manipuler comme un tableau.
Exemple :
Echo $_POST['xyz'][0] ; // ==>va afficher  'Lorem'
Echo $_POST['xyz'][4]; // ==>  va afficher 'amet'
devdream
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019

Merci pour ton aide, je vais bosser dessus ... et reviens vers toi ...
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019

Je t'avoue que je suis perdu :

je ne sais pas à quel moment récupérer les $_POST[][], je dois faire l'EXPLODE de mon nom de fichier pcq ma table possède deux colonnes (nom et ext)
$pic2=$nomdestination;
$explode= explode(".",$pic2);
$photo2=$explode[0];
$ext2=$explode[1];

ni ou integrer ma requête INSERT ...
jordane45
Messages postés
27660
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2020
324
Hummmm..... cela ressemble à une "nouvelle" question.....
Donc ?? .comme le veut l'usage de ce site....signifie... ouverture d'une nouvelle discussion !

Mais avant d'aller ouvrir cette nouvelle discussion je vais tout de même te donner quelques pistes à explorer.


=> Tu as bien créé un "formulaire" html dans lequel tu fait sélectionner les images à importer aux utilisateur ?
-> Ce formulaire est bien de type POST ?
-> Ce formulaire pointe via ACTION vers ton script PHP ?

quelque chose du genre :
<form name="monformulaire" methode="POST" action="mapage.php">
<input type="text" id="input1" name="toto[]" value="" >
<input type="text" id="input2" name="toto[]" value="" >
<input type="submit" value="Valider">
</form>


Dans ta page php (celle apellée via l'action)...
Tu y récupères les variables issues de ton formulaire ?
=> DONC LES $_POST

C'est aussi ici que tu vas mettre le code que je t'ai proposé avant... ainsi que ta requête d'INSERT et aussi le SPLIT de tes variables....

Voilou... comme on dit.. y'a plus qu'à !
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019

voilà ou j'en suis !

mon formulaire

<form action="traitement?ref=<?php echo $id;?>" method="POST" enctype="multipart/form-data">
<div class="element">
<label for="photo2">Photo 2 <span class="red"> *</span></label>
<input type="file" name="photo[]" />
</div>
<div class="element">
<label for="photo3">Photo 3</label>
<input type="file" name="photo[]" />
</div>

et la page traitement_photos, l'include connect et require de la classe upload est:


for($i=1;$i<=9;$i++)
{
if(isset($_POST['photo'.$i]))
{
echo "<br>".$_POST['photo'.$i]." => ".UploadFile('../uploads/',$_POST['photo'.$i]);
}

}

$pic=$_POST['photo1'];
$explode= explode(".",$pic);
$photo1=$explode[0];
$ext1=$explode[1];

$rq='INSERT into portfolio(id_lien,photo,ext)
values ("'.$id_bien.'","'.$photo1.'","'.$ext1.'")';

$result=mysql_query($rq);

Je pense avoir un problème avec le traitement du nom, pcq à la lecture ça devrait donner $_POST['photo1'] alors que dans la boucle for le résultat est : $_POST['photo'.$i] ...
Messages postés
27660
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2020
324
Vu que désormais tu utilises des inputs de même nom (sous forme de tableau -> Array()) tu peux utiliser pour tes boucles des foreach

$photos = $_POST['photo'];
foreach ( $photos as $photo ){
 echo "<br>".$photo." -> ";
 Echo UploadFile('../uploads/',$photo); 

// ici tu traites aussi tes explodes...et ton insertion en BDD

}




Dis moi si c'est mieux.
(là je code de tête)
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019

Tout d'abord je suis contente d'être tomber sur toi ...MERCI
J'ai mis en commentaire la boucle "FOR"
et utiliser le foreach

Mais ca ne fonctionne pas, c'est comme si $photos n'était pas considérer comme un tableau : Invalid argument supplied for foreach()


$photos = $_POST['photo'];

foreach ( $photos as $photo )
{
echo "<br>".$photo." -> ";
echo UploadFile('../uploads/',$photo);


$explode= explode(".",$photo);
$photo1=$explode[0];
$ext1=$explode[1];

$rq='INSERT into porfolio(id_lien,photo,ext)
values ("'.$id_bien.'","'.$photo1.'","'.$ext1.'")';
$result=mysql_query($rq);
}

--
Messages postés
27660
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2020
324
Petit oubli de ma part...
Il faut vérifier que la variable contenant les photos est 'remplie' avant de vouloir boucler dessus... sinon.. le tableau n'existant pas il te met une erreur.
if (isset($_POST['photo'])){
 $photos = $_POST['photo'];
 foreach ( $photos as $photo ){
  Echo "<br>".$photo." -> ";
  Echo UploadFile('../uploads/',$photo); 

 // ici tu traites aussi tes explodes...et ton insertion en BDD

 }
}else{
 Echo " <br><b> AUCUNE PHOTO N'A ETE PASSEE EN ARGUMENT ! </b><br>";
}


Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019

Et effectivement il passe dans le else, donc pas de contenu ...

--
jordane45
Messages postés
27660
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2020
324
Tu peux me montrer TOUT le code de ton <form ....
c'est à dire jusqu'à .. </form>
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019



<form action="traitement_portfolio.php?ref=<?php echo $id;?>" method="POST" enctype="multipart/form-data">

<div class="up">
<label for="photo2">Photo 2 </label>
<input type="file" name="photo[]" />
</div>
<div class="up">
<label for="photo3">Photo 3 </label>
<input type="file" name="photo[]" />
</div>
<div class="up">
<label for="photo4">Photo 4 </label>
<input type="file" name="photo[]" />
</div>
<div class="up">
<label for="photo5">Photo 5 </label>
<input type="file" name="photo[]" />
</div>
<div class="up">
<label for="photo6">Photo 6</label>
<input type="file" name="photo[]" />
</div>
<div class="up">
<label for="photo7">Photo 7 </label>
<input type="file" name="photo[]" />
</div>
<div class="up">
<label for="photo8">Photo 8 </label>
<input type="file" name="photo[]" />
</div>
<div class="up">
<label for="photo9">Photo 9 </label>
<input type="file" name="photo[]" />
</div>
<div class="up">
<label for="photo10">Photo 10 </label>
<input type="file" name="photo[]" />
</div>


<div class="entry">
<button type="submit" name="soumettre" class="add">VALIDER</button>
<button type="reset" class="cancel">EFFACER</button>
</div>

</form>



--
jordane45
Messages postés
27660
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2020
324
Bonjour,

Est-ce que tu as vérifié le paramétrage de ton Php.ini ?
(avant d'essayer de multiple upload, est-ce que quand tu le faisait un par un ça fonctionnait ?)

Sinon :
http://www.commentcamarche.net/faq/889-php-upload-de-fichiers

Le fichier de configuration php.ini permet la configuration du serveur PHP. Il contient entre autres des directives permettant d'autoriser ou non l'envoi de fichiers via un formulaire ainsi que de le paramétrer :

file_uploads= On/Off permet d'autoriser ou non l'envoi de fichiers.
upload_tmp_dir = répertoire permet de définir le répertoire temporaire permettant d'accueillir le fichier uploadé.
upload_max_filesize = 2M permet de définir la taille maximale autorisée pour le fichier. Si cette limite est dépassée, le serveur enverra un code d'erreur.
post_max_size indique la taille maximale des données envoyées par un formulaire. Cette directive prime sur upload_max_filesize, il faut donc s'assurer d'avoir post_max_size supérieure à upload_max_filesize

Ensuite.. pourquoi passer par une boucle FOR (i ...) alors qu'avec un FOREACH ce serait plus propre.

Après.. tu as omis la vérification (pourtant proposée par le créateur de la class pour s'assurer que l'upload s'est correctement fait.)
if (!$obj->uploadFichier())
 {
     // affichage d'une erreur en cas d'echec
		echo $obj->affichageErreur();
 } 
  else{
	 	// autrement tout est ok!
             // ICI TU FAIS L'IMPORT DANS TA BDD
 }



Autre poit, pour le répertoire de déstination, évite de travailler avec des chemins relatifs ('../uploads/' ) mais préfère mettre des chemins depuis la racine de ton site.

Par exemple, si ton rep Upload se trouve à la racine du www... tu mets juste : $_SERVER['DOCUMENT_ROOT']./'uploads/'



Au cas où, tu peux toujours utiliser la méthode utilisée dans le manuel php (exemple 3 ) : http://www.php.net/manual/fr/features.file-upload.post-method.php

Formulaire HTML
<form action="mapage.php" method="post" enctype="multipart/form-data">
<p>Images:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Send" />
</p>
</form>


mapage.php :
<?php
$uploads_dir = $_SERVER['DOCUMENT_ROOT'] . "/upload/";
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name,$uploads_dir.$name");
    }
}
?>




Je n'ai toujours pas eu le temps de tester la class que tu utilises..
J'essaiera demain en fonction de mon taff..
Mais que ça ne t'empche pas d'essayer de trouver la réponse à ton souci par toi même ^^
devdream
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019

merci Jordane, pur tes nombreux retours, j'utilise effectivement cette classe pour un upload "seul" et ça fonctionne. je vais étudier tes suggestions. Quant au chemin relatif, ça marche parfaitement pour mon upload unique, mais merci pour tes conseils avisés... Je t'en suis reconnaissante !
devdream
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019

Je viens de mettre la verif en place par contre pour remplacer le for par le foreach,comment procéder?
devdream
Messages postés
45
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
20 novembre 2019

Dans le Foreach, chacunes de mes valeurs
$_FILES['photo']['name'][0]
(de o à 8) ont une valeur (image.jpg par exemple)

mais comment déclarer ce tableau comprenant toute ces valeurs?


$tab=array($_FILES ???);
foreach ($tab as $path)
{
...

Merci ...
jordane45
Messages postés
27660
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 février 2020
324
Au même titre que $_POST est un tableau contenant toutes les données issues de ton formulaire... $_FILES est déjà un tableau contenant TOUS les fichiers envoyés via ton formulaire....

A voir la syntaxe que tu essaies d'utiliser
$_FILES['photo']['name'][0]
je pense qu'un tour sur les tutoriels PHP concernant les ARRAY et leur manipulation te serait plus que nécessaire avant de poursuivre ....
exemple : http://php.net/manual/fr/control-structures.foreach.php

Est-ce qu'au moins tu testes les exemples que je te donne ?
A aucun moment je n'ai redéclaré un tableau....