Estou usando jQuery e Ajax para que meus formulários enviem dados e arquivos, mas não sei como enviar dados e arquivos em um formulário?
Atualmente, faço quase o mesmo com os dois métodos, mas a maneira pela qual os dados são reunidos em uma matriz é diferente, os dados usam, .serialize();
mas os arquivos usam= new FormData($(this)[0]);
É possível combinar os dois métodos para poder fazer upload de arquivos e dados em um formulário através do Ajax?
Dados jQuery, Ajax e html
$("form#data").submit(function(){
var formData = $(this).serialize();
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="data" method="post">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<button>Submit</button>
</form>
Arquivos jQuery, Ajax e html
$("form#files").submit(function(){
var formData = new FormData($(this)[0]);
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="files" method="post" enctype="multipart/form-data">
<input name="image" type="file" />
<button>Submit</button>
</form>
Como posso combinar o que foi dito acima para enviar dados e arquivos de uma forma via Ajax?
Meu objetivo é poder enviar todo esse formulário em um post com o Ajax, é possível?
<form id="datafiles" method="post" enctype="multipart/form-data">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<input name="image" type="file" />
<button>Submit</button>
</form>
javascript
jquery
ajax
forms
Dan
fonte
fonte
FormData
abordagem deve funcionar bem com formulários que contêm o que você deseja, não apenas os campos de upload de arquivo; embora não seja amplamente suportado.FormData
Respostas:
O problema que tive foi usar o identificador jQuery errado.
Você pode carregar dados e arquivos com um formulário usando o ajax .
PHP + HTML
jQuery + Ajax
Versão curta
fonte
$(this)[0]
é apenas um apelido dethis
, portantonew FormData(this)
deve ser suficiente.async: false
não parece necessário para que isso trabalho e faz com que o bloqueio em (única rosca) navegadores móveisoutra opção é usar um iframe e definir o destino do formulário para ele.
você pode tentar isso (ele usa jQuery):
funciona bem com todos os navegadores, você não precisa serializar ou preparar os dados. Uma desvantagem é que você não pode monitorar o progresso.
Além disso, pelo menos para o chrome, a solicitação não aparecerá na guia "xhr" das ferramentas do desenvolvedor, mas em "doc"
fonte
Eu estava tendo esse mesmo problema no ASP.Net MVC com HttpPostedFilebase e, em vez de usar o formulário no envio, precisava usar o botão no clique onde precisava fazer algumas coisas e, se tudo bem, o formulário de envio então aqui está como eu o fiz funcionar
isso preencherá corretamente o seu modelo MVC, verifique se o seu Model, The Property for HttpPostedFileBase [] tem o mesmo nome que o Nome do controle de entrada em html, isto é,
fonte
contentType : "application/octet-stream"
Ou mais curto:
fonte
Para mim, não funcionou sem
enctype: 'multipart/form-data'
campo na solicitação do Ajax. Espero que ajude alguém que está preso em um problema semelhante.Embora o
enctype
atributo já tenha sido definido no formulário , por algum motivo, a solicitação do Ajax não identificou automaticamente aenctype
declaração sem declaração explícita (jQuery 3.3.1).Como outros mencionados acima, preste atenção especial aos campos
contentType
eprocessData
.fonte
enctype
não é mencionada.enctype
campo não esteja coberto na documentação por um motivo. Eu não verifiquei o código fonte do jQuery, portanto não posso dizer com certeza.enctype
campo e ele não carrega mais arquivos (retorna erro de tipo de codificação). Não sei como isso funciona, pois não verifiquei o código-fonte do jQuery. Postei esta resposta com a intenção de ajudar outras pessoas que estão presas em um problema semelhante. Não estou buscando votos positivos aqui ... Se você tiver mais perguntas / comentários, vamos conversar em vez de comentar.Para mim, seguindo o trabalho de código
No seu Action Post Method, passe o parâmetro como HttpPostedFileBase UploadFile e verifique se a entrada do arquivo tem a mesma mencionada no parâmetro do Action Method. Também deve funcionar com o formulário AJAX Begin.
Lembre-se de que aqui o seu formulário AJAX BEGIN não funcionará aqui, pois você faz sua chamada definida no código mencionado acima e pode referenciar seu método no código conforme a exigência
Eu sei que estou respondendo tarde, mas é isso que funcionou para mim
fonte
Uma maneira simples, mas mais eficaz:
new FormData()
é ela mesma como um recipiente (ou um saco). Você pode colocar tudo attr ou arquivo em si. A única coisa que você precisará acrescentar é,attribute, file, fileName
por exemplo:e apenas passá-lo na solicitação AJAX. Por exemplo:
Você pode acrescentar n número de arquivos ou dados com o FormData.
e se você estiver fazendo uma solicitação AJAX do arquivo Script.js para o arquivo Route no Node.js, tenha cuidado
req.body
ao acessar dados (texto)req.files
para acessar o arquivo (imagem, vídeo etc.)fonte
No meu caso, eu tive que fazer uma solicitação POST, que tinha informações enviadas através do cabeçalho, e também um arquivo enviado usando um objeto FormData.
Eu fiz funcionar usando uma combinação de algumas das respostas aqui, então basicamente o que acabou funcionando foi ter essas cinco linhas na minha solicitação do Ajax:
Onde formData era uma variável criada assim:
fonte
contentType: "application/octet-stream",
é ativamente prejudicial e o único motivo para não causar um problema é porque você o substitui duas linhas depois.enctype: 'multipart/form-data',
é inútil. O jQuery.ajax não reconhece esse paramater.///// otherpage.php
fonte