Gostaria de fazer upload de um arquivo de forma assíncrona com o jQuery.
$(document).ready(function () {
$("#uploadbutton").click(function () {
var filename = $("#file").val();
$.ajax({
type: "POST",
url: "addFile.do",
enctype: 'multipart/form-data',
data: {
file: filename
},
success: function () {
alert("Data Uploaded: ");
}
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>
Em vez de o arquivo ser carregado, estou obtendo apenas o nome do arquivo. O que posso fazer para corrigir esse problema?
javascript
jquery
ajax
asynchronous
xmlhttprequest
Sergio del Amo
fonte
fonte
Respostas:
Com o HTML5, você pode fazer upload de arquivos com Ajax e jQuery. Além disso, você pode fazer validações de arquivos (nome, tamanho e tipo MIME) ou manipular o evento progress com a tag de progresso HTML5 (ou uma div). Recentemente, tive que fazer um upload de arquivos, mas não queria usar Flash, Iframes ou plugins e, depois de algumas pesquisas, encontrei a solução.
O HTML:
Primeiro, você pode fazer alguma validação, se quiser. Por exemplo, no
.on('change')
evento do arquivo:Agora,
$.ajax()
envie com o clique do botão:Como você pode ver, com o upload de arquivos HTML5 (e algumas pesquisas), não só se torna possível, mas super fácil. Experimente com o Google Chrome, pois alguns dos componentes HTML5 dos exemplos não estão disponíveis em todos os navegadores.
fonte
name="file"
é muito importante na<input>
tag do arquivo se você usar os dados em PHP (e provavelmente em outros lugares). Criei um formulário dinamicamente usando javascript, para não precisar do atributo name, mas descobri da maneira mais difícil que você absolutamente precisa para recuperar o servidor de dados.Atualização de 2019: ainda depende dos navegadores usados por seus dados demográficos.
Uma coisa importante a entender com a "nova"
file
API HTML5 é que ela não era suportada até o IE 10 . Se o mercado específico que você deseja atingir tem uma propensão acima da média em relação às versões mais antigas do Windows, talvez você não tenha acesso a ele.A partir de 2017, cerca de 5% dos navegadores são do IE 6, 7, 8 ou 9. Se você ingressar em uma grande corporação (por exemplo, esta é uma ferramenta B2B ou algo que você está entregando para treinamento), esse número pode disparar. . Em 2016, lidei com uma empresa que usa o IE8 em mais de 60% de suas máquinas.
É 2019 a partir desta edição, quase 11 anos após a minha resposta inicial. O IE9 e inferiores estão globalmente em torno da marca de 1%, mas ainda existem grupos de maior uso.
A solução importante disso, seja qual for o recurso, é verificar o navegador que seus usuários usam . Caso contrário, você aprenderá uma lição rápida e dolorosa sobre por que "funciona para mim" não é bom o suficiente para ser entregue a um cliente. caniuse é uma ferramenta útil, mas observe de onde eles tiram os dados demográficos. Eles podem não se alinhar com o seu. Isso nunca é mais verdadeiro que os ambientes corporativos.
Minha resposta de 2008 segue.
No entanto, existem métodos não JS viáveis para upload de arquivos. Você pode criar um iframe na página (que você esconde com CSS) e depois direcionar seu formulário para postar nesse iframe. A página principal não precisa ser movida.
É uma postagem "real", portanto não é totalmente interativa. Se você precisar de status, precisará de algo do lado do servidor para processar isso. Isso varia enormemente, dependendo do seu servidor. O ASP.NET possui mecanismos melhores. O PHP plain falha, mas você pode usar as modificações Perl ou Apache para contornar isso.
Se você precisar de vários uploads de arquivos, é melhor fazer cada arquivo um de cada vez (para superar os limites máximos de upload de arquivos). Poste o primeiro formulário no iframe, monitore seu progresso usando o descrito acima e, quando terminar, poste o segundo formulário no iframe e assim por diante.
Ou use uma solução Java / Flash. Eles são muito mais flexíveis no que podem fazer com suas postagens ...
fonte
Eu recomendo usar o plug-in Fine Uploader para esse fim. Seu
JavaScript
código seria:fonte
Nota: Esta resposta está desatualizada, agora é possível fazer upload de arquivos usando o XHR.
Você não pode carregar arquivos usando XMLHttpRequest (Ajax). Você pode simular o efeito usando um iframe ou Flash. O excelente plugin jQuery Form, que publica seus arquivos em um iframe para obter o efeito.
fonte
Finalizando para futuros leitores.
Upload de arquivo assíncrono
Com HTML5
Você pode fazer upload de arquivos com jQuery usando o
$.ajax()
método se FormData e a API de arquivos forem suportadas (ambos os recursos HTML5).Você também pode enviar arquivos sem o FormData, mas a API do arquivo deve estar presente para processar os arquivos de forma que possam ser enviados com XMLHttpRequest (Ajax).
Para obter um exemplo rápido e puro de JavaScript ( sem jQuery ), consulte " Enviando arquivos usando um objeto FormData ".
Cair pra trás
Quando o HTML5 não é suportado (sem API de arquivos ), a única outra solução JavaScript pura (sem Flash ou qualquer outro plug-in de navegador) é a técnica iframe oculta , que permite emular uma solicitação assíncrona sem usar o objeto XMLHttpRequest .
Consiste em definir um iframe como destino do formulário com as entradas do arquivo. Quando o usuário envia uma solicitação, é feito o upload dos arquivos, mas a resposta é exibida dentro do iframe, em vez de renderizar novamente a página principal. Ocultar o iframe torna todo o processo transparente para o usuário e emula uma solicitação assíncrona.
Se feito corretamente, deve funcionar virtualmente em qualquer navegador, mas possui algumas advertências sobre como obter a resposta do iframe.
Nesse caso, você pode preferir usar um plug-in wrapper como o Bifröst, que usa a técnica iframe, mas também fornece um transporte jQuery Ajax que permite enviar arquivos com o
$.ajax()
método a seguir:Plugins
O Bifröst é apenas um pequeno invólucro que adiciona suporte de fallback ao método ajax do jQuery, mas muitos dos plug-ins mencionados, como o jQuery Form Plugin ou o jQuery File Upload, incluem toda a pilha do HTML5 a diferentes fallbacks e alguns recursos úteis para facilitar o processo. Dependendo de suas necessidades e requisitos, convém considerar uma implementação simples ou um desses plug-ins.
fonte
contentType: false
. Quando não enviei isso com o chrome, o tipo de conteúdo do formulário foi invalidado pelo jQuery..done()
e.fail()
. Além disso, um exemplo sem o uso deFormData
e uma lista de prós / contras seria incrível.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Esse plug-in jQuery de upload de arquivo AJAX carrega o arquivo de alguma forma e transmite a resposta a um retorno de chamada, nada mais.
<input type="file">
- Use tão pouco quanto -
- ou tanto quanto -
fonte
Eu tenho usado o script abaixo para fazer upload de imagens que, por acaso, funcionam bem.
HTML
Javascript
Explicação
Eu uso o response
div
para mostrar a animação do upload e a resposta após o término do upload.A melhor parte é que você pode enviar dados extras, como IDs, etc. com o arquivo ao usar esse script. Eu mencionei isso
extra-data
como no script.No nível PHP, isso funcionará como o upload normal de arquivos. dados extras podem ser recuperados como
$_POST
dados.Aqui você não está usando um plugin e outras coisas. Você pode alterar o código como desejar. Você não está codificando cegamente aqui. Essa é a funcionalidade principal de qualquer upload de arquivo jQuery. Na verdade Javascript.
fonte
addEventListener
não é entre navegadores.Você pode fazer isso em JavaScript vanilla com bastante facilidade. Aqui está um trecho do meu projeto atual:
fonte
ondrop
evento você pode fazervar file = e.dataTransfer.files[0]
Você pode fazer o upload simplesmente com o jQuery
.ajax()
.HTML:
CSS
Javascript:
fonte
A maneira mais simples e robusta de fazer isso no passado é simplesmente direcionar uma tag oculta do iFrame com seu formulário - ela será enviada no iframe sem recarregar a página.
Ou seja, se você não quiser usar um plug-in, JavaScript ou qualquer outra forma de "mágica" que não seja HTML. Claro que você pode combinar isso com JavaScript ou o que você tem ...
Você também pode ler o conteúdo do iframe
onLoad
para erros do servidor ou respostas bem-sucedidas e, em seguida, enviá-lo para o usuário.Chrome, iFrames e onLoad
Você só precisa continuar lendo se estiver interessado em como configurar um bloqueador de interface do usuário ao fazer upload / download
Atualmente, o Chrome não aciona o evento onLoad para o iframe quando usado para transferir arquivos. Firefox, IE e Edge disparam o evento onload para transferências de arquivos.
A única solução que encontrei para o Chrome foi usar um cookie.
Para fazer isso basicamente quando o upload / download é iniciado:
Usar um cookie para isso é feio, mas funciona.
Eu criei um plugin jQuery para lidar com esse problema do Chrome ao fazer o download, você pode encontrar aqui
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
O mesmo princípio básico também se aplica ao upload.
Para usar o downloader (inclua o JS, obviamente)
E no lado do servidor, pouco antes de transferir os dados do arquivo, crie o cookie
O plug-in verá o cookie e acionará o
onComplete
retorno de chamada.fonte
Uma solução que encontrei foi ter como
<form>
alvo um iFrame oculto. O iFrame pode executar o JS para exibir ao usuário que está completo (no carregamento da página).fonte
Eu escrevi isso em um ambiente Rails . É apenas cerca de cinco linhas de JavaScript, se você usar o plugin leve do jQuery-form.
O desafio está em fazer o upload do AJAX funcionar, pois o padrão
remote_form_for
não entende o envio de formulários com várias partes. Ele não enviará os dados do arquivo que o Rails procura com a solicitação AJAX.É aí que o plugin jQuery-form entra em ação.
Aqui está o código Rails para isso:
Aqui está o JavaScript associado:
E aqui está a ação do controlador Rails, bastante baunilha:
Eu tenho usado isso nas últimas semanas com o Bloggity, e funcionou como um campeão.
fonte
Simple Ajax Uploader é outra opção:
https://github.com/LPology/Simple-Ajax-Uploader
Exemplo de uso:
fonte
IE7+
! Experimentando agora. ObrigadoO jQuery Uploadify é outro bom plugin que eu usei antes para fazer upload de arquivos. O código JavaScript é tão simples quanto o seguinte: code. No entanto, a nova versão não funciona no Internet Explorer.
Pesquisei bastante e cheguei a outra solução para carregar arquivos sem nenhum plug-in e somente com ajax. A solução é a seguinte:
fonte
Aqui está apenas outra solução de como fazer upload de arquivo ( sem nenhum plug-in )
Usando Javascripts simples e AJAX (com barra de progresso)
Parte HTML
Parte JS
Parte do PHP
Aqui está o aplicativo EXEMPLO
fonte
Você pode usar os dados do formulário para postar todos os seus valores, incluindo imagens.
fonte
cache: false
é redundante em umaPOST
solicitação, poisPOST
nunca faz cache.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Para fazer upload de arquivo de forma assíncrona com o Jquery, use as etapas abaixo:
etapa 1 No seu projeto, abra o Nuget manager e adicione o pacote (jquery fileupload (você só precisa escrevê-lo na caixa de pesquisa, ele será instalado e instalado)). URL: https://github.com/blueimp/jQuery-File- Envio
etapa 2 Adicione os scripts abaixo nos arquivos HTML, que já foram adicionados ao projeto executando o pacote acima:
Etapa 3 Escreva o controle de upload de arquivo conforme o código abaixo:
etapa 4 escreva um método js como uploadFile como abaixo:
Etapa 5 No upload do arquivo do elemento de chamada de função pronto para iniciar o processo conforme abaixo:
Etapa 6 Escreva o controlador MVC e a ação conforme abaixo:
fonte
Uma abordagem moderna sem o Jquery é usar o objeto FileList de onde você retorna
<input type="file">
quando o usuário seleciona um (s) arquivo (s) e depois usar Buscar para publicar o FileList envolvido em um objeto FormData .fonte
Você pode ver uma solução resolvida com uma demonstração funcional aqui, que permite visualizar e enviar arquivos de formulário para o servidor. Para o seu caso, você precisa usar o Ajax para facilitar o upload do arquivo no servidor:
Os dados enviados são dados de formulário. No jQuery, use uma função de envio de formulário em vez de clicar em um botão para enviar o arquivo de formulário, como mostrado abaixo.
Ver mais detalhes
fonte
Exemplo: se você usa o jQuery, pode facilitar o upload de um arquivo. Este é um plugin jQuery pequeno e forte, http://jquery.malsup.com/form/ .
Exemplo
Espero que seja útil
fonte
Você pode usar
Demo
fonte
Converta o arquivo em base64 usando o readAsDataURL () ou o codificador base64 do HTML5 . Violino aqui
Então, para recuperar:
fonte
Você pode passar parâmetros adicionais junto com o nome do arquivo ao fazer upload assíncrono usando XMLHttpRequest (sem dependência de flash e iframe). Anexe o valor do parâmetro adicional ao FormData e envie a solicitação de upload.
Além disso, o upload do arquivo de interface do usuário do Syncfusion JavaScript fornece solução para esse cenário simplesmente usando o argumento de evento. você pode encontrar documentação aqui e mais detalhes sobre esse controle aqui, digite a descrição do link aqui
fonte
Procure Gerenciando o processo de upload de um arquivo, de forma assíncrona aqui: https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
Amostra do link
fonte
Esta é a minha solução.
e os js
Controlador
fonte
Usando HTML5 e JavaScript , o upload assíncrono é bastante fácil, eu crio a lógica de upload junto com seu html. Isso não funciona totalmente porque precisa da API, mas demonstre como funciona, se você tiver o endpoint chamado a
/upload
partir da raiz do seu site, este código deve funcionar para você:Também algumas informações adicionais sobre XMLHttpReques:
Para mais detalhes, você pode continuar lendo aqui ...
fonte
Você pode usar a API de busca mais recente por JavaScript. Como isso:
Vantagem: a API de busca é suportada nativamente por todos os navegadores modernos, para que você não precise importar nada. Além disso, observe que fetch () retorna uma promessa que é manipulada usando
.then(..code to handle response..)
assincronamente.fonte
Você pode fazer o upload de arquivos múltiplos assíncronos usando JavaScript ou jQuery e outros sem usar nenhum plug-in. Você também pode mostrar o progresso em tempo real do upload do arquivo no controle de progresso. Encontrei 2 links interessantes -
A linguagem do lado do servidor é C #, mas você pode fazer algumas modificações para fazê-la funcionar com outra linguagem, como PHP.
Upload de arquivo ASP.NET Core MVC:
No modo de exibição, crie o controle de upload de arquivo em html:
Agora crie o método de ação no seu controlador:
A variável hostingEnvironment é do tipo IHostingEnvironment que pode ser injetada no controlador usando injeção de dependência, como:
fonte
Para PHP, procure https://developer.hyvor.com/php/image-upload-ajax-php-mysql
HTML
JAVASCRIPT
PHP
fonte
Você também pode usar algo como https://uppy.io .
Ele faz o upload de arquivos sem navegar para fora da página e oferece alguns bônus, como arrastar e soltar, retomando os envios em caso de falhas do navegador / redes inadequadas e importando do Instagram, por exemplo. É de código aberto e não depende do jQuery / React / Angular / Vue, mas pode ser usado com ele. Isenção de responsabilidade: como criador, sou tendencioso;)
fonte