Como posso converter meu objeto JS para FormData
?
O motivo pelo qual quero fazer isso é porque tenho um objeto que construí com os cerca de 100 valores de campo de formulário.
var item = {
description: 'Some Item',
price : '0.00',
srate : '0.00',
color : 'red',
...
...
}
Agora fui solicitado a adicionar a funcionalidade de upload de arquivo ao meu formulário, o que, obviamente, é impossível via JSON e, portanto, estou planejando mudar para FormData
. Existe alguma maneira de converter meu objeto JS FormData
?
javascript
jquery
multipartform-data
form-data
Kamran Ahmed
fonte
fonte
FormData
objeto.Respostas:
Se você tiver um objeto, poderá criar facilmente um objeto FormData e anexar os nomes e valores desse objeto a formData.
Você não postou nenhum código, então é um exemplo geral;
Existem mais exemplos na documentação do MDN
fonte
item
é um objeto regular criado pelo OP, então não deve ter nenhuma propriedade que não seja sua, a menos que alguém cometa o erro de prototipar algo no construtor de objeto, caso em que você estaria em um mundo de problemas , e não é algo contra o qual devemos ter que nos proteger.Object.keys
não é a resposta, já que você não deve ter que obter as chaves como um array e, em seguida, iterar sobre as chaves para obter os valores, você deve usar umfor..in
loop.Object.keys
ouhasOwnProperty()
porque o objeto está postado na pergunta e não deve precisar de nenhum desses. A razão pela qual você às vezes vê sendohasOwnProperty
usados em plug-ins etc. é porque você nunca sabe o que algumas pessoas podem fazer com oObject
construtor, mas na maioria das vezes as pessoas não deveriam ter que testar propriedades herdadas em objetos que criaram, isso é um sinal de que provavelmente você está fazendo algo errado.Com ES6 e uma abordagem de programação mais funcional, a resposta de @adeneo poderia ser assim:
E, alternativamente, usando
.reduce()
as funções e seta:fonte
Esta função adiciona todos os dados do objeto ao FormData
Versão ES6 de @ developer033:
versão jQuery:
fonte
&& !(data instanceof Blob)
no meu caso para fazer o upload das minhas imagens&& !(Array.isArray(data) && !data.length)
a condição "se" ou o array vazio seria removido.As outras respostas estavam incompletas para mim. Comecei a partir da resposta @Vladimir Novopashin e modifiquei. Aqui estão as coisas que eu precisava e o bug que encontrei:
.prop
vez de[prop]
. Por exemplo,formData.append('photos[0][file]', file)
não funcionou no google chrome, enquantoformData.append('photos[0].file', file)
trabalhavaO código a seguir deve funcionar no IE11 e navegadores permanentes.
fonte
formData.append(root, data)
, não significa que foi adicionado à raiz.Experimente a função JSON.stringify conforme abaixo
fonte
Tive um cenário em que o JSON aninhado precisava ser serializado de maneira linear enquanto os dados do formulário eram construídos, pois é assim que o servidor espera valores. Então, escrevi uma pequena função recursiva que traduz o JSON que é assim:
Em algo assim:
O servidor aceitará os dados do formulário neste formato convertido.
Aqui está a função:
Invocação:
Estou usando o testJSON apenas para ver os resultados convertidos, pois não seria capaz de extrair o conteúdo de form_data. Pós-chamada AJAX:
fonte
Desculpe pela resposta tardia, mas eu estava lutando com isso porque o Angular 2 atualmente não suporta o upload de arquivos. Então, a maneira de fazer isso foi enviando um
XMLHttpRequest
comFormData
. Então, criei uma função para fazer isso. Estou usando o Typescript . Para convertê-lo para Javascript, basta remover a declaração de tipos de dados.fonte
[]
propriedades de objeto dentro de uma matriz numérica para permanecer intactaVersão TypeScript:
https://gist.github.com/Mds92/091828ea857cc556db2ca0f991fee9f6
fonte
namespace
é uma palavra-chave reservada emTypeScript
( typescriptlang.org/docs/handbook/namespaces.html e github.com/Microsoft/TypeScript/issues/… ). Além disso, parece que você se esqueceu de tratarFile
desde a últimaelse
vontadeappend
"[object File]"
até oformData
.Você pode simplesmente instalar
qs
:Basta importar:
Passe o objeto para
qs.stringify()
:fonte
Recursivamente
fonte
Este método converte um objeto JS em FormData:
fonte
Object.entries(value).forEach((v, k) => acc.append(`${key}[${v[0]}]`, v[1]));
No meu caso, meu objeto também tinha uma propriedade que era array de arquivos. Como são binários, devem ser tratados de forma diferente - o índice não precisa fazer parte da chave. Então eu modifiquei a resposta de @Vladimir Novopashin e @ developer033:
fonte
Eu usei isso para postar meus dados de objeto como dados de formulário.
fonte
Talvez você esteja procurando por isso, um código que recebe seu objeto javascript, cria um objeto FormData a partir dele e, em seguida, faz o POST em seu servidor usando a nova API Fetch :
fonte
Eu me refiro a isso da resposta de Gudradain . Eu edito um pouco no formato Typescript.
fonte
Posso chegar um pouco atrasado para a festa, mas foi isso que criei para converter um objeto singular em FormData.
Como funciona? Ele irá converter e retornar todas as propriedades esperadas dos objetos File que você definiu na lista de ignorados (segundo argumento. Se alguém pudesse me dizer uma maneira melhor de determinar isso, isso ajudaria!) Em uma string json usando
JSON.stringify
. Em seguida, em seu servidor, você só precisará convertê-lo de volta em um objeto JSON.Exemplo:
Ainda sou meio novo em solicitações de Http e JavaScript, então qualquer feedback seria muito apreciado!
fonte
Tente obj2fd => https://www.npmjs.com/package/obj2fd
fonte