Comment puis-je convertir mon objet JS en FormData
?
La raison pour laquelle je veux faire cela est que j'ai un objet que j'ai construit à partir des ~ 100 valeurs de champ de formulaire.
var item = {
description: 'Some Item',
price : '0.00',
srate : '0.00',
color : 'red',
...
...
}
On me demande maintenant d'ajouter la fonctionnalité de téléchargement de fichier à mon formulaire, ce qui, bien sûr, est impossible via JSON et je prévois donc de passer à FormData
. Alors, y a-t-il un moyen de convertir mon objet JS en FormData
?
javascript
jquery
multipartform-data
form-data
Kamran Ahmed
la source
la source
FormData
objet.Réponses:
Si vous avez un objet, vous pouvez facilement créer un objet FormData et ajouter les noms et les valeurs de cet objet à formData.
Vous n'avez posté aucun code, c'est donc un exemple général;
Il y a plus d'exemples dans la documentation sur MDN
la source
item
est un objet régulier créé par l'OP, il ne devrait donc pas avoir de propriétés qui ne lui soient pas propres, à moins que quelqu'un n'ait commis l'erreur de prototyper quelque chose sur le constructeur Object, auquel cas vous seriez dans un monde de problèmes , et ce n'est pas quelque chose dont nous devrions nous protéger.Object.keys
n'est pas la réponse, car vous ne devriez pas avoir à obtenir les clés sous forme de tableau, puis itérer sur les clés pour obtenir les valeurs, vous devriez utiliser unefor..in
boucle.Object.keys
ouhasOwnProperty()
car l'objet est affiché dans la question et ne devrait pas en avoir besoin. La raison pour laquelle vous voyez parfoishasOwnProperty
utilisé dans les plugins, etc. est que vous ne savez jamais ce que certaines personnes pourraient faire auObject
constructeur, mais pour la plupart, les gens ne devraient pas avoir à tester les propriétés héritées des objets qu'ils ont créés, c'est un signe que vous faites probablement quelque chose de mal.Avec ES6 et une approche de programmation plus fonctionnelle, la réponse de @ adeneo pourrait ressembler à ceci:
Et alternativement en utilisant
.reduce()
et les fonctions fléchées:la source
Cette fonction ajoute toutes les données de l'objet à FormData
Version ES6 de @ developer033:
Version jQuery:
la source
&& !(data instanceof Blob)
dans mon cas pour télécharger mes images&& !(Array.isArray(data) && !data.length)
la condition "si", sinon le tableau vide serait supprimé.Les autres réponses étaient incomplètes pour moi. Je suis parti de la réponse de @Vladimir Novopashin et je l'ai modifiée. Voici les choses dont j'avais besoin et le bug que j'ai trouvé:
.prop
au lieu de[prop]
. Par exemple,formData.append('photos[0][file]', file)
ne fonctionnait pas sur Google Chrome, alors queformData.append('photos[0].file', file)
travaillaitLe code suivant devrait fonctionner sur les navigateurs IE11 et Evergreen.
la source
formData.append(root, data)
, cela ne signifie pas qu'elle est ajoutée à la racine.Essayez la fonction JSON.stringify comme ci-dessous
la source
J'ai eu un scénario dans lequel le JSON imbriqué devait être sérialisé de manière linéaire pendant la construction des données de formulaire, car c'est ainsi que le serveur attend des valeurs. Donc, j'ai écrit une petite fonction récursive qui traduit le JSON qui est comme ceci:
Dans quelque chose comme ça:
Le serveur accepterait les données de formulaire qui sont dans ce format converti.
Voici la fonction:
Invocation:
J'utilise testJSON uniquement pour voir les résultats convertis car je ne pourrais pas extraire le contenu de form_data. Appel post AJAX:
la source
Désolé pour une réponse tardive, mais j'avais du mal avec cela car Angular 2 ne prend actuellement pas en charge le téléchargement de fichiers. Donc, la façon de le faire était d'envoyer un
XMLHttpRequest
avecFormData
. Alors, j'ai créé une fonction pour le faire. J'utilise Typescript . Pour le convertir en Javascript, supprimez simplement la déclaration des types de données.la source
[]
propriétés d'objet for dans un tableau numérique pour rester intactVersion TypeScript:
https://gist.github.com/Mds92/091828ea857cc556db2ca0f991fee9f6
la source
namespace
un mot clé réservé dansTypeScript
( typescriptlang.org/docs/handbook/namespaces.html et github.com/Microsoft/TypeScript/issues/… ). De plus, il semble que vous ayez oublié de vous en occuperFile
depuis le dernierelse
testamentappend
"[object File]"
auformData
.Vous pouvez simplement installer
qs
:Importez simplement:
Passer l'objet à
qs.stringify()
:la source
Récursivement
la source
Cette méthode convertit un objet JS en FormData:
la source
Object.entries(value).forEach((v, k) => acc.append(`${key}[${v[0]}]`, v[1]));
Dans mon cas, mon objet avait également une propriété qui était un tableau de fichiers. Puisqu'ils sont binaires, ils doivent être traités différemment - l'index n'a pas besoin de faire partie de la clé. J'ai donc modifié la réponse de @Vladimir Novopashin et de @ developer033:
la source
Je l'ai utilisé pour publier mes données d'objet en tant que données de formulaire.
la source
Peut-être que vous recherchez ceci, un code qui reçoit votre objet javascript, créez un objet FormData à partir de celui-ci, puis POST-le sur votre serveur à l'aide de la nouvelle API Fetch :
la source
Je fais référence à cela d' après la réponse de Gudradain . Je l'édite un peu au format Typescript.
la source
Je suis peut-être un peu en retard à la fête, mais c'est ce que j'ai créé pour convertir un objet singulier en FormData.
Comment ça marche? Il convertira et retournera toutes les propriétés attendues des objets File que vous avez définis dans la liste des ignorés (2ème argument. Si quelqu'un pouvait me dire une meilleure façon de déterminer cela, cela aiderait!) En une chaîne json en utilisant
JSON.stringify
. Ensuite, sur votre serveur, il vous suffira de le reconvertir en objet JSON.Exemple:
Je suis encore un peu nouveau dans les requêtes Http et JavaScript, donc tout commentaire serait très apprécié!
la source
Essayez obj2fd => https://www.npmjs.com/package/obj2fd
la source