¿Cómo puedo convertir mi objeto JS a FormData
?
La razón por la que quiero hacer esto es que tengo un objeto que construí a partir de ~ 100 valores de campo de formulario.
var item = {
description: 'Some Item',
price : '0.00',
srate : '0.00',
color : 'red',
...
...
}
Ahora se me pide que agregue la funcionalidad de carga de archivos a mi formulario, lo cual, por supuesto, es imposible a través de JSON y, por lo tanto, estoy planeando pasar a FormData
. Entonces, ¿hay alguna forma en que pueda convertir mi objeto JS FormData
?
javascript
jquery
multipartform-data
form-data
Kamran Ahmed
fuente
fuente
FormData
objeto.Respuestas:
Si tiene un objeto, puede crear fácilmente un objeto FormData y agregar los nombres y valores de ese objeto a formData.
No ha publicado ningún código, por lo que es un ejemplo general;
Hay más ejemplos en la documentación sobre MDN
fuente
item
es un objeto regular creado por el OP, por lo que no debería tener propiedades que no sean las suyas, a menos que alguien haya cometido el error de crear un prototipo de algo en el constructor del objeto, en cuyo caso estaría en un mundo de problemas. , y no es algo contra lo que debamos tener que protegernos.Object.keys
no es la respuesta, ya que no debería tener que obtener las claves como una matriz, luego iterar sobre las claves para obtener los valores, debería utilizar unfor..in
bucle.Object.keys
ohasOwnProperty()
ya que el objeto está publicado en la pregunta y no debería necesitar ninguno de esos. La razón por la que a veces sehasOwnProperty
usa en complementos, etc.es porque nunca se sabe lo que algunas personas podrían hacer con elObject
constructor, pero en su mayor parte, las personas no deberían tener que probar las propiedades heredadas en los objetos que han creado, eso es una señal de que probablemente estés haciendo algo mal.Con ES6 y un enfoque de programación más funcional, la respuesta de @ adeneo podría verse así:
Y alternativamente usando
.reduce()
y funciones de flecha:fuente
Esta función agrega todos los datos del objeto a FormData
Versión ES6 de @ developer033:
Versión de jQuery:
fuente
&& !(data instanceof Blob)
en mi caso para cargar mis imágenes&& !(Array.isArray(data) && !data.length)
la condición "si" o se eliminaría la matriz vacía.Las otras respuestas fueron incompletas para mí. Comencé desde la respuesta de @Vladimir Novopashin y la modifiqué. Aquí están las cosas que necesitaba y el error que encontré:
.prop
lugar de[prop]
. Por ejemplo,formData.append('photos[0][file]', file)
no funcionó en Google Chrome, mientrasformData.append('photos[0].file', file)
trabajabaEl siguiente código debería funcionar en IE11 y navegadores perennes.
fuente
formData.append(root, data)
, no significa que se haya agregado a la raíz.Pruebe la función JSON.stringify como se muestra a continuación
fuente
Tuve un escenario en el que JSON anidado tenía que serializarse de forma lineal mientras se construían los datos del formulario, ya que así es como el servidor espera los valores. Entonces, escribí una pequeña función recursiva que traduce el JSON que es así:
En algo como esto:
El servidor aceptará datos de formulario que estén en este formato convertido.
Aquí está la función:
Invocación:
Estoy usando testJSON solo para ver los resultados convertidos, ya que no podría extraer el contenido de form_data. Llamada posterior a AJAX:
fuente
Perdón por una respuesta tardía, pero estaba luchando con esto ya que Angular 2 actualmente no admite la carga de archivos. Por lo tanto, la manera de hacerlo que estaba enviando una
XMLHttpRequest
conFormData
. Entonces, creé una función para hacerlo. Estoy usando Typecript . Para convertirlo a Javascript, simplemente elimine la declaración de tipos de datos.fuente
[]
para las propiedades del objeto dentro de una matriz numérica para permanecer intactoVersión de TypeScript:
https://gist.github.com/Mds92/091828ea857cc556db2ca0f991fee9f6
fuente
namespace
es una palabra clave reservada enTypeScript
( typescriptlang.org/docs/handbook/namespaces.html y github.com/Microsoft/TypeScript/issues/… ). Además, parece que se le olvidó tratarFile
desde la últimaelse
voluntadappend
"[object File]"
hasta elformData
.Simplemente puede instalar
qs
:Simplemente importe:
Pasar objeto a
qs.stringify()
:fuente
Recursivamente
fuente
Este método convierte un objeto JS en un FormData:
fuente
Object.entries(value).forEach((v, k) => acc.append(`${key}[${v[0]}]`, v[1]));
En mi caso, mi objeto también tenía una propiedad que era una matriz de archivos. Dado que son binarios, deben tratarse de manera diferente: el índice no necesita ser parte de la clave. Así que modifiqué la respuesta de @Vladimir Novopashin y @ developer033:
fuente
Usé esto para publicar mis datos de objeto como datos de formulario.
fuente
Tal vez esté buscando esto, un código que recibe su objeto javascript, crea un objeto FormData a partir de él y luego lo envía a su servidor usando la nueva API Fetch :
fuente
Hago referencia a esto de la respuesta de Gudradain . Lo edito un poco en formato Typecript.
fuente
Puede que llegue un poco tarde a la fiesta, pero esto es lo que he creado para convertir un objeto singular en FormData.
¿Como funciona? Convertirá y devolverá todas las propiedades, excepto los objetos de archivo que haya configurado en la lista de ignorados (segundo argumento. Si alguien pudiera decirme una mejor manera de determinar esto, ¡eso ayudaría!) En una cadena json usando
JSON.stringify
. Luego, en su servidor, solo tendrá que convertirlo nuevamente en un objeto JSON.Ejemplo:
Todavía soy un poco nuevo en las solicitudes de Http y JavaScript, por lo que cualquier comentario sería muy apreciado.
fuente
Pruebe obj2fd => https://www.npmjs.com/package/obj2fd
fuente