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 arr
variable, que es una matriz, aparece como una cadena.
Cuando no lo envío con ajax como datos de formulario, pero uso la $.POST
opció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
FormData
esta 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 esarr
correcto? Probé ambos pero soloarr[]
funcionó.arr
simplemente 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 niarr
niarr[]
se redefinió en mi caso. Obtuve una matriz múltiple en FormData con la misma clave pero un valor diferente. Entonces obtuvearr
con valor1
y otroarr
con valor2
.arr
tambié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