Estoy usando ajax para enviar un formulario de varias partes con matriz, campos de texto y archivos.
Añado cada VAR a los datos principales como tal
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);
luego uso la función ajax para enviarlo a un archivo PHP para almacenar dentro de SQL DB.
$.ajax({
type: "post",
url: 'php/submittionform.php',
cache: false,
processData: false,
contentType: false,
data: data,
success: function(request) {$('#box').html(request); }
})
Pero en el lado de PHP, la arrvariable, que es una matriz, aparece como una cadena.
Cuando no lo envío con ajax como datos de formulario, pero uso la $.POSTopción simple , lo obtengo como una matriz en el lado de PHP, pero luego no puedo enviar los archivos también.
alguna solución?
javascript
ajax
arrays
form-data
shultz
fuente
fuente

También puede enviar una matriz de
FormDataesta manera:Por lo tanto, puede escribir de
arr[]la misma manera que lo hace con un formulario HTML simple. En el caso de PHP debería funcionar.Puede encontrar útil este artículo: ¿Cómo pasar una matriz dentro de una cadena de consulta?
fuente
arr[]en elformData.append('arr[]', arr[i]);? ¿por qué no esarrcorrecto? Probé ambos pero soloarr[]funcionó.arrsimplemente redefina este valor en cada iteración del ciclo, y al final, el valor final sería igual al último elemento de la matriz, pero no a la matriz completaarr[], por qué no searr[]redefine?arr[]también es una cuerda. Y mientras probaba tanto niarrniarr[]se redefinió en mi caso. Obtuve una matriz múltiple en FormData con la misma clave pero un valor diferente. Entonces obtuvearrcon valor1y otroarrcon valor2.arrtambién funcionó para matrices. En este tema hay una respuesta más detallada a esta preguntafor (var i = 0; i < myArr; i++) { var myItemInArr = myArr[i]; for (var prop in myItemInArr) { fileData.append(`myArr[${i}][${prop}]`, myItemInArr[prop]); } }Esta es una pregunta antigua, pero recientemente encontré este problema al publicar objetos junto con archivos. Necesitaba poder publicar un objeto, con propiedades secundarias que también fueran objetos y matrices.
La siguiente función recorrerá un objeto y creará el objeto formData correcto.
Esto convertirá el siguiente json:
en el siguiente FormData
fuente
(value !== null) && formData.append(key, value)lugar de simplemente, de loformData.append(key, value)contrario, falla en valores nulosVersión mecanografiada:
Utilizando:
fuente
agregue todas las entradas de tipo a FormData
fuente
Si ha anidado objetos y matrices, la mejor forma de rellenar el objeto FormData es mediante la recursividad.
fuente
Próxima versión válida para modelo que contiene arays de valores simples:
fuente
Basado en @YackY respuesta versión de recursividad más corta:
Ejemplo de uso:
Datos enviados:
fuente