J'utilise ajax pour soumettre un formulaire en plusieurs parties avec un tableau, des champs de texte et des fichiers.
J'ajoute chaque VAR aux données principales comme tel
var attachments = document.getElementById('files');
var data= new FormData();
for (i=0; i< attachments.files.length; i++){
data.append('file', attachments.files[i]);
console.log(attachments.files[i]);
data.append ('headline', headline);
data.append ('article', article);
data.append ('arr', arr);
data.append ('tag', tag);
puis j'utilise la fonction ajax pour l'envoyer dans un fichier PHP à stocker dans sql DB.
$.ajax({
type: "post",
url: 'php/submittionform.php',
cache: false,
processData: false,
contentType: false,
data: data,
success: function(request) {$('#box').html(request); }
})
Mais du côté PHP, la arr
variable, qui est un tableau, apparaît sous forme de chaîne.
Lorsque je ne l'envoie pas avec ajax en tant que données de formulaire mais que j'utilise l' $.POST
option simple , je l'obtiens en tant que tableau du côté PHP, mais je ne peux pas non plus envoyer les fichiers.
des solutions?
javascript
ajax
arrays
form-data
Shultz
la source
la source
Vous pouvez également envoyer un tableau de
FormData
cette manière:Vous pouvez donc écrire de
arr[]
la même manière que vous le faites avec un simple formulaire HTML. Dans le cas de PHP, cela devrait fonctionner.Cet article peut vous être utile: Comment passer un tableau dans une chaîne de requête?
la source
arr[]
enformData.append('arr[]', arr[i]);
? pourquoi n'est pasarr
correct? J'ai essayé les deux mais seulementarr[]
travaillé.arr
vous redéfinissez simplement cette valeur à chaque itération de boucle, et à la fin, la valeur finale serait égale au dernier élément du tableau, mais pas à tout le tableauarr[]
, pourquoi n'est-elle pasarr[]
redéfinie?arr[]
est également une chaîne. Et tout en testant les deux niarr
n'aarr[]
été redéfini dans mon cas. J'ai plusieurs tableaux dans FormData avec la même clé mais une valeur différente. Donc j'ai euarr
avec valeur1
et un autrearr
avec valeur2
.arr
fonctionnait également pour les tableaux. Dans cette rubrique, il y a une réponse plus détaillée à cette questionfor (var i = 0; i < myArr; i++) { var myItemInArr = myArr[i]; for (var prop in myItemInArr) { fileData.append(`myArr[${i}][${prop}]`, myItemInArr[prop]); } }
C'est une vieille question, mais j'ai récemment rencontré ce problème avec la publication d'objets avec des fichiers. J'avais besoin de pouvoir publier un objet, avec des propriétés enfants qui étaient également des objets et des tableaux.
La fonction ci-dessous parcourt un objet et crée l'objet formData correct.
Cela convertira le json suivant -
dans le FormData suivant
la source
(value !== null) && formData.append(key, value)
au lieu de simplementformData.append(key, value)
sinon, il échoue sur des valeurs nullesVersion dactylographiée:
En utilisant:
la source
ajouter toutes les entrées de type à FormData
la source
Si vous avez des objets et des tableaux imbriqués, la meilleure façon de remplir l'objet FormData consiste à utiliser la récursivité.
la source
Version suivante valide pour le modèle contenant des arays de valeurs simples:
la source
Basé sur la version de récursivité plus courte de @YackY answer:
Exemple d'utilisation:
Données envoyées:
la source