11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

dans un formulaire de ce type:


          <form id="main-form" action="drag-ajax.php" method="post" enctype="multipart/form-data">
            <div class="form-group">
              <label for="marque">Marque</label>
              <input type="text" class="form-control" id="marque" name="marque" placeholder="entrer la marque">
            </div>
            <div class="form-group">
              <label for="modele">Modèle</label>
              <input type="text" class="form-control" id="modele" name="modele" placeholder="entrer le modèle">
            </div>

            <div class="form-group">
              <label for="files-by-form">télécharger des fichiers</label>
              <input type="file" multiple name="files-by-form[]" class="form-control-file" id="files-by-form">
            </div>

            <button id="submit-form" type="submit" class="btn btn-primary">Valider</button>
          </form>



je peux récupérer des fichiers dans le champ input type file.
Ensuite au niveau du javascript je créé un objet formData à partir des données du formulaire
et je cherche à afficher les paires clés-valeurs


document.getElementById('submit-form').addEventListener("click", formValidated);

function formValidated(e)  {
	e.preventDefault();

	var form = document.getElementById('main-form');
	var myData = new FormData(form);
	
	// Display the key/value pairs
	for(var entryForm of myData.entries()) {
	   console.log(entryForm[0]+ ', '+ entryForm[1]); 
	}


dans la boucle for, les valeur du champ multiple ne s'affichent pas ( contenu de files-by-form[] )

pour afficher les valeurs correspondantes aux fichiers choisis, je dois invoquer cette commande:

console.log(myData.getAll('files-by-form[]'));


La seule solution que j'ai trouvé est ceci:

	// Display the key/value pairs
	for(var entryForm of myData.entries()) {
		if (entryForm[0] != 'files-by-form[]') {
		  console.log(entryForm[0]+ ', '+ entryForm[1]); 
		}
	}
  console.log(myData.getAll('files-by-form[]'));



par contre si j'envoie cet objet formData via un objet ajax, je récupère bien toutes les valeurs du formulaire avec les tableaux $_FILES et $_POST u niveau du PHP

Comment pourrait-on lister toutes les valeurs du formulaire dans une seule boucle ?
Modifié par lionel_css3 (30 Jan 2018 - 20:08)
Modérateur
<<<EDIT
Je viens de relire ton sujet et qu'est ce que formData ? Que font les méthodes formData.getAll() et formData.entries() ?
Je ne sais pas si ma réponse ci-dessous t'indique une piste à suivre.
EDIT;

Je t'invite à exécuter le script ci-dessous et de voir en console ce que ça t'indique. Pour la suite, je te laisse l'imaginer) :


    document.getElementById('main-form').addEventListener('submit', (e)=>{
        console.log('objet filelist ==> ', document.getElementById('files-by-form').files);
        let data = document.getElementById('files-by-form').files;
        for(let i = 0; i < data.length; i++){
            console.log('nom du fichier ==> ', data[i]['name']);
        }
        e.preventDefault();
    });


Au passage, on ne clique pas sur un input/button type submit, on soumet un formulaire. Smiley smile
Modifié par niuxe (30 Jan 2018 - 23:28)
niuxe a écrit :

Je viens de relire ton sujet et qu'est ce que formData ? Que font les méthodes formData.getAll() et formData.entries() ?
Je ne sais pas si ma réponse ci-dessous t'indique une piste à suivre.

formData est un objet Javascript qui sert à créer (ou récupérer depuis un formulaire) des paires clé/valeur du même format que celles générées par l'attribut 'name' dans les champs <input> du formulaire.
Ensuite on peut envoyer cet objet, via Ajax, vers un script Php et on récupérera son contenu à travers les tableaux $_POST et/ou $_FILES.
Ça peut permettre par exemple d'envoyer des données qui ne seraient pas issues du formulaire: par exemple des données concernant fichiers drag-n-dropés.
Documentation et méthodes formData
Récupérer ces données en soi dans le code JS n'est pas primordial, puisqu'on pourrait le faire à partir des champs du formulaire lui même et que l'objet formData est prévu pour les requêtes Ajax, mais je suis en train de préparer un tuto vidéo et je voulais lister (automatiquement) le contenu de l'objet formData juste pour un motif pédagogique Smiley smile
Ici j'avais voulu lister le contenu du champ <input name="files-by-form[]" .... > de manière automatique sans avoir à le nommer.
niuxe a écrit :

Au passage, on ne clique pas sur un input/button type submit, on soumet un formulaire. Smiley smile

Tu as raison, mais dans ce cas ça ne changeait rien à l'exposition du problème. Smiley cligne
Modérateur
Euhh il suffit de ne pas concaténer et convertir en string pour tout afficher non?


console.log(entryForm[0] + ': ', entryForm[1]); 
Je comprends pas.. hier ça marchait pas :
Maintenant si j'exécute:

	for(var entryForm of myData.entries()) {
		  console.log(entryForm[0]+ ', '+ entryForm[1]); 
	}


j'obtiens le détail dans la console comme ceci

marque, Ford
modele, Mustang
[…]
0: File { name: "1-puma.jpg", lastModified: 1028627846000, size: 161414, … }
1: File { name: "3-big.eagle.jpg", lastModified: 1028627856000, size: 97118, … }
2: File { name: "4-bear.jpg", lastModified: 1028627860000, size: 93838, … }
length: 3
__proto__: Array []

alors que hier pour les 3 éléments 'files' , je n'avais juste que le type de l'objet qui s'affichait, et pas le contenu...
Modérateur
Comme tu as fait ton console.log, moi ça me donne bien un truc du genre:

modele, Mustang
files-by-form[], [Object File]
files-by-form[], [Object File]

C'est juste que tu convertis à l'arrache File en String…
ben en fait.. ça marche de façon aléatoire je viens d'avoir ceci encore dans la console

marque, Ford 
modele, Mustang
files-by-form[], [object File]

un coup ça marche, un coup ça marche pas
kustolovic a écrit :


C'est juste que tu convertis à l'arrache File en String…


il faudrait que je teste si c'est un tableau?
Modérateur
J'ai donné la solution plus haut :
laisser console.log se débrouiller sans convertir le type (qui n'est pas un tableau):


console.log(entryForm[0], entryForm[1]);
Meilleure solution
kustolovic a écrit :
J'ai donné la solution plus haut :
laisser console.log se débrouiller sans convertir le type (qui n'est pas un tableau):


Tu as raison, je comprends mieux maintenant: en concaténant une virgule, je forçais console.log à convertir l'ensemble en chaine de caractère...
J'ai fait comme dans ton exemple et c'est mieux !!!

merci pour ton aide Smiley smile


marque Renault
modele Megane
files-by-form[] File { name: "1-puma.jpg", lastModified: 1028627846000, lastModifiedDate: Date 2002-08-06T09:57:26.000Z, webkitRelativePath: "", size: 161414, type: "image/jpeg" }
files-by-form[] File { name: "3-big.eagle.jpg", lastModified: 1028627856000, lastModifiedDate: Date 2002-08-06T09:57:36.000Z, webkitRelativePath: "", size: 97118, type: "image/jpeg" }
files-by-form[] File { name: "4-bear.jpg", lastModified: 1028627860000, lastModifiedDate: Date 2002-08-06T09:57:40.000Z, webkitRelativePath: "", size: 93838, type: "image/jpeg" }