FormData.append ("clave", "valor") no funciona


107

¿Puedes decirme qué pasa con esto?

var formdata = new FormData();
formdata.append("key", "value");
console.log(formdata);

Mi salida se ve así, no puedo encontrar mi par "clave" - ​​"valor"

FormData
*__proto__: FormData
**append: function append() { [native code] }
***arguments: null
***caller: null
***length: 0
***name: "append"
***prototype: append
***__proto__: function Empty() {}
*constructor: function FormData() { [native code] }
**arguments: null
**caller: null
**length: 0
**name: "FormData"
**prototype: FormData
**toString: function toString() { [native code] }
*__proto__: Object
**__proto__: Object
**__defineGetter__: function __defineGetter__() { [native code] }
**__defineSetter__: function __defineSetter__() { [native code] }
**__lookupGetter__: function __lookupGetter__() { [native code] }
**__lookupSetter__: function __lookupSetter__() { [native code] }
**constructor: function Object() { [native code] }
**hasOwnProperty: function hasOwnProperty() { [native code] }
**isPrototypeOf: function isPrototypeOf() { [native code] }
**propertyIsEnumerable: function propertyIsEnumerable() { [native code] }
**toLocaleString: function toLocaleString() { [native code] }
**toString: function toString() { [native code] }
**valueOf: function valueOf() { [native code] }

¡No puedo entender! Ayer funcionó tan bien, ¡y hoy mi cabeza chocó el teclado tantas veces! Firefox, Chrome, ambos iguales: /

Respuestas:


127

Nuevo en Chrome 50+ y Firefox 39+ (resp. 44+):

  • formdata.entries()(combinar con Array.from()para debugabilidad)
  • formdata.get(key)
  • y métodos más muy útiles

Respuesta original:

Lo que suelo hacer para "depurar" un FormDataobjeto es simplemente enviarlo (¡a cualquier lugar!) Y comprobar los registros del navegador (por ejemplo, la pestaña Red de Chrome devtools).

No necesita el mismo marco Ajax. No necesitas ningún detalle. Solo envialo:

var xhr = new XMLHttpRequest;
xhr.open('POST', '/', true);
xhr.send(data);

Fácil.


gracias: esta fue una forma rápida y útil de obtener el objeto FormData escribiéndolo en la consola de Chrome.
Dan Smart

Según Google formData, los métodos se agregaron en Chrome v50.
thdoan

¿Cómo miraría los registros del navegador si es un navegador móvil como Safari? Estoy usando el objeto FormData en una aplicación web para dispositivos móviles y no puedo averiguar cómo depurarlo.
kiwicomb123

1
@ kiwicomb123 Formdata.entries()+ Array.from()+ alert()si es lo suficientemente moderno, o busque en la depuración móvil
Rudie

así que no hay borde o ie11?
SuperUberDuper

50

Dices que no funciona. ¿Qué esperas que pase?

No hay forma de obtener los datos de un FormDataobjeto; solo está diseñado para que lo use para enviar datos junto con un XMLHttpRequestobjeto (para el sendmétodo).

Actualización casi cinco años después: en algunos navegadores más nuevos, esto ya no es cierto y ahora puede ver los datos proporcionados FormDataademás de simplemente rellenarlos. Consulte la respuesta aceptada para obtener más información.


20
OK ... esto apesta. ¿Por qué no puedo registrar FormData en mi consola? :-( Esto simplemente no tiene sentido para mí, ya que pensé que era un objeto común
netzaffin

12
@netzaffin: tanto Firebug como el inspector de Chrome le permiten ver los parámetros de solicitud enviada en una solicitud XHR siempre que haya abierto la pestaña de red y haya comenzado a iniciar sesión, por lo que debería poder arreglárselas con eso. También puede crear un objeto contenedor que registre los campos y se agregue a FormData, y luego verificar los valores (sin olvidar enviar el FormData interno en lugar del objeto contenedor).
Jesper

1
Al menos, ¿puedo comprobar si el formdataobjeto tiene un archivo dentro?
MarceloBarbosa

1
@MarceloBarbosa: No parece que puedas sacarle información. Solo tendrá que conservar esta información usted mismo.
Jesper

Como lo señaló @Jesper, puede verificar la solicitud XHR enviada en la pestaña de la pestaña de red de las herramientas del desarrollador, hay una opción de Params que incluso le permite ver el contenido de la solicitud POST enviada. También la respuesta.
Anirudh

23

Es posible que haya tenido el mismo problema que yo tenía inicialmente. Estaba tratando de usar FormData para tomar todos mis archivos de entrada para cargar una imagen, pero al mismo tiempo quería agregar una ID de sesión a la información que se pasa al servidor. Durante todo este tiempo, pensé que al agregar la información, podría verla en el servidor al acceder al objeto. Estaba equivocado. Cuando agrega a FormData, la forma de verificar la información adjunta en el servidor es mediante una simple $_POST['*your appended data*']consulta. al igual que:

js:

$('form').submit(function(){
    var sessionID = 8;
    var formData = new FormData(this);
    formData.append('id', sessionID);

    $.ajax({
        url: "yoururl.php",
        data: formData,
        processData: false,
        contentType: false,
        type: 'POST',
        success: function(data){
            alert(data);
        }
    });
});

luego en php:

$sessionID = $_POST['id'];
$files = $_FILES['image'];

$foreach ($files as $key=>val){
    //...
}

17

Si está en Chrome, puede verificar los datos de publicación

Aquí es cómo verificar los datos de la publicación

  1. Ir a la pestaña Red
  2. Busque el enlace al que está enviando los datos de la publicación
  3. Haz click en eso
  4. En los encabezados, puede verificar Solicitar carga útil para verificar los datos de publicación

DevTools de Chrome



5

los datos del formulario no aparecen en la consola del navegador web

for (var data of formData) {
  console.log(data);
}

intente de esta manera se mostrará


2

En mi caso en el navegador Edge:

  const formData = new FormData(this.form);
  for (const [key, value] of formData.entries()) {
      formObject[key] = value;
  }

dame el mismo error

Así que no estoy usando FormDatay solo construyo un objeto manualmente

import React from 'react';    
import formDataToObject from 'form-data-to-object';

  ...

let formObject = {};

// EDGE compatibility -  replace FormData by
for (let i = 0; i < this.form.length; i++) {
  if (this.form[i].name) {
    formObject[this.form[i].name] = this.form[i].value;
  }
}

const data = formDataToObject.toObj(formObject): // convert "user[email]":"customer@mail.com" => "user":{"email":"customer@mail.com"}

const orderRes = await fetch(`/api/orders`, {
        method: 'POST',
        credentials: 'same-origin',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify(data)
      });

const order = await orderRes.json();

2

Reaccionar versión

Asegúrate de tener un encabezado con 'content-type': 'multipart/form-data'

_handleSubmit(e) {
    e.preventDefault();
    const formData = new FormData();
          formData.append('file', this.state.file);
    const config = {
      headers: {
        'content-type': 'multipart/form-data'
      }
    }

     axios.post("/upload", formData, config)
         .then((resp) => {
             console.log(resp)
         }).catch((error) => {
    })
  }

  _handleImageChange(e) {
    e.preventDefault();
    let file = e.target.files[0];
    this.setState({
      file: file
    });
  }

Ver

  #html
 <input className="form-control"
    type="file" 
    onChange={(e)=>this._handleImageChange(e)} 
 />
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.