Probé varios enfoques y seguí muchas preguntas en StkOvfl y las especificaciones W3, pero aún no tengo idea.
Tengo una entrada de formulario:
<input type="file" multiple accept="image/*" id="item-image-upload" > Luego, en mi Javascript (método prepareFormData ): [Ver la clase esencial completa aquí] :
var files = this.getFiles(); var formData = new FormData(); for (var i = 0; i < files.length; i++) { var file = files[i]; if (!file.type.match('image.*')) { continue; } formData.append(this.uploadEntityName, file); } Cuando console.log(files), obtengo todos los archivos bien. Pero formData no funciona. También intenté agregar un elemento arbitrario como:
formData.append("Apple", 1);La respuesta que recibo está vacía. El servidor reposa en php como:
public function uploadImage(){ return json_encode(array_merge($_REQUEST, $_FILES)); }Ahora estoy 99% seguro de que es su encabezado, y que si mira en sus registros o activa las Advertencias de PHP, verá Warning: Missing boundary in multipart/form-data POST data in Unknown on line 0
Copié esto (y agregué su línea de encabezado y eliminé el archivo de entrada) de MDN y lo ejecuté en un script en mi cuadro de desarrollo que está configurado para gritar todos los errores y obtuve ese error, seguido de una matriz vacía
var formData = new FormData(); formData.append("username", "Groucho"); formData.append("accountnum", 123456); // number 123456 is immediately converted to a string "123456" // JavaScript file-like object var content = '<a id="a"><b id="b">hey!</b></a>'; // the body of the new file... var blob = new Blob([content], { type: "text/xml"}); formData.append("somefiles[]", blob); var request = new XMLHttpRequest(); request.open("POST", "MYDEVBOX/testpost.php"); // remove the line below and it works request.setRequestHeader("Content-Type", "multipart/form-data"); request.responseType = "json"; request.send(formData); Volver unos minutos más tarde después de decidir investigar por qué. Tiene que ver con el límite de los datos de varias partes. El XHR configura automáticamente el encabezado con el límite coincidente cuando hace xhr.send(formData) (o en algún lugar del camino). Cuando configura ese encabezado, la solicitud lo usa en su lugar, borrando el límite y PHP no sabe dónde dividir la entrada. Aquí hay una captura de pantalla rápida que lo señala mucho mejor.