Estou usando ajax para enviar um formulário multiparte com array, campos de texto e arquivos.
Anexo cada VAR aos dados principais, assim
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);
então eu uso a função ajax para enviá-lo a um arquivo PHP para armazenar dentro do banco de dados sql.
$.ajax({
type: "post",
url: 'php/submittionform.php',
cache: false,
processData: false,
contentType: false,
data: data,
success: function(request) {$('#box').html(request); }
})
Mas no lado do PHP, a arr
variável, que é um array, aparece como uma string.
Quando eu não o envio com ajax como dados de formulário, mas uso a $.POST
opção simples, eu o obtenho como um array no lado do PHP, mas não consigo enviar os arquivos também.
alguma solução?
javascript
ajax
arrays
form-data
shultz
fonte
fonte
Você também pode enviar uma matriz
FormData
desta forma:Portanto, você pode escrever
arr[]
da mesma maneira que faria com um formulário HTML simples. No caso do PHP, deve funcionar.Você pode achar este artigo útil: Como passar uma matriz em uma string de consulta?
fonte
arr[]
emformData.append('arr[]', arr[i]);
? porque não estáarr
correto? Tentei os dois, mas sóarr[]
funcionou.arr
você apenas redefinir este valor em cada iteração do loop, e no final, o valor final seria igual ao último elemento da matriz, mas não a matriz inteiraarr[]
, por que não éarr[]
redefinido?arr[]
também é uma string. E ao testar ambos nemarr
nemarr[]
foi redefinido no meu caso. Eu tenho vários array em FormData com a mesma chave, mas com valor diferente. Então eu pegueiarr
com valor1
e outraarr
com valor2
.arr
também funcionou para arrays. Em este tema há uma resposta mais detalhada a esta perguntafor (var i = 0; i < myArr; i++) { var myItemInArr = myArr[i]; for (var prop in myItemInArr) { fileData.append(`myArr[${i}][${prop}]`, myItemInArr[prop]); } }
Esta é uma questão antiga, mas recentemente encontrei este problema ao postar objetos junto com arquivos. Eu precisava ser capaz de postar um objeto, com propriedades filho que eram objetos e matrizes também.
A função abaixo irá percorrer um objeto e criar o objeto formData correto.
Isso converterá o seguinte json -
no seguinte FormData
fonte
(value !== null) && formData.append(key, value)
vez de apenasformData.append(key, value)
falhar em valores nulosVersão datilografada:
Usando:
fonte
adicione todas as entradas de tipo a FormData
fonte
Se você tiver objetos e matrizes aninhados, a melhor maneira de preencher o objeto FormData é usando recursão.
fonte
Próxima versão válida para modelo contendo matrizes de valores simples:
fonte
Com base na versão de recursão mais curta da resposta @YackY:
Exemplo de uso:
Dados enviados:
fonte