Uploads multiple

devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019 - Modifié par BunoCS le 5/02/2014 à 10:21
jordane45 Messages postés 38179 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 mai 2024 - 10 févr. 2014 à 10:19
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

jordane45 Messages postés 38179 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 mai 2024 344
Modifié par jordane45 le 5/02/2014 à 12:13
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
0
devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019
5 févr. 2014 à 12:28
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 ?

--
0
jordane45 Messages postés 38179 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 mai 2024 344
Modifié par jordane45 le 5/02/2014 à 12:37
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'
0
devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019
5 févr. 2014 à 13:41
Merci pour ton aide, je vais bosser dessus ... et reviens vers toi ...
0
devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019
Modifié par noctambule28 le 5/02/2014 à 14:56
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 ...
0
jordane45 Messages postés 38179 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 mai 2024 344
5 févr. 2014 à 15:02
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'à !
0
devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019
6 févr. 2014 à 08:58
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] ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38179 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 mai 2024 344
Modifié par jordane45 le 6/02/2014 à 09:42
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)
0
devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019
6 févr. 2014 à 10:27
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);
}

--
0
jordane45 Messages postés 38179 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 mai 2024 344
Modifié par jordane45 le 6/02/2014 à 11:21
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
0
devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019
6 févr. 2014 à 11:52
Et effectivement il passe dans le else, donc pas de contenu ...

--
0
jordane45 Messages postés 38179 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 mai 2024 344
6 févr. 2014 à 12:02
Tu peux me montrer TOUT le code de ton <form ....
c'est à dire jusqu'à .. </form>
0
devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019
Modifié par devdream le 6/02/2014 à 12:49


<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>



--
0
jordane45 Messages postés 38179 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 mai 2024 344
6 févr. 2014 à 19:33
Tu peux ajouter un
print_r($_POST)
dans ton fichier traitement_portfolio.php et nous dire ce que ça donne ?
0
devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019
6 févr. 2014 à 19:47
ca m'indique : Array ([soumettre]=>)
0
jordane45 Messages postés 38179 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 mai 2024 344
6 févr. 2014 à 20:08
Arfff.. c'est de ma faute...

J'avais zappé que les Input de type FILE ne sont pas envoyés dans $_POST mais dans $_FILES

C'est la class que tu utilises qui m'a trompé.

Il faudrait que je la teste pour voir comment on pourrait se dépatouiller de mic-mac.. mais ce soir je n'aurai pas le temps.

A la rigueur, tu peux toujours essayer de remplacer la boucle for que je t'ai fait écrire précédemment et essayer avec une boucle du style :

foreach($_FILES as $file => $details)
{   // Move each file from its temp directory to $ROOT
    $temp = $details['tmp_name'];
    $target = $details['name'];
  Echo "<br>".$target." -> ";
  Echo UploadFile('../uploads/',$target); 

}
0
devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019
6 févr. 2014 à 20:41
Merci Jordane, mais là aussi je m'arrête pour ce soir
0
devdream Messages postés 45 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 20 novembre 2019
7 févr. 2014 à 12:10
Personne pour me dépatouiller ?
0
Rejoignez-nous