Baixar arquivo usando jQuery


113

Como posso solicitar um download para um usuário quando ele clica em um link.

Por exemplo, em vez de:

<a href="uploads/file.doc">Download Here</a>

Eu poderia usar:

<a href="#">Download Here</a>

 $('a').click... //Some jquery to download the file

Dessa forma, o Google não indexa meus HREFs e arquivos privados.

Isso pode ser feito com jQuery, se sim, como? Ou isso deve ser feito com PHP ou algo assim?


Possível duplicata do arquivo
Liam

Respostas:


165

Eu poderia sugerir isso, como uma solução degradante mais elegante, usando preventDefault:

$('a').click(function(e) {
    e.preventDefault();  //stop the browser from following
    window.location.href = 'uploads/file.doc';
});

<a href="no-script.html">Download now!</a>

Mesmo que não haja Javascript, pelo menos assim o usuário receberá algum feedback.


20
jQuery é a resposta.
Esteban Küber de

Obrigado, é isso que eu estava procurando. Eu costumo usar "preventDefault", apenas deixei de fora porque eu estava sendo preguiçoso. ;-)
Dodinas

2
Funciona muito bem, mas obtém alguns erros de tipo MIME. Curioso para saber se há alguma maneira de passar por eles?
Nathan Hangen

2
Você resolveu o aviso de tipo MIME? Recebo "Recurso interpretado como documento, mas transferido com tipo MIME ..." Muito obrigado.
user1824269

22

Se você não quiser que os mecanismos de pesquisa indexem certos arquivos, use o robots.txt para dizer aos web spiders que não acessem certas partes do seu site.

Se você depender apenas do javascript, alguns usuários que navegam sem ele não conseguirão clicar em seus links.


1
É bom saber sobre o 'robots.txt'. Obrigado.
Dodinas de

@Rob, se você precisa que os URLs sejam "privados", robots.txtnão ajudaria porque eles ainda estariam armazenados no histórico do navegador e nos servidores intermediários.
Pacerier

3
6 anos depois: navegando sem javascript? - bem, você também pode dar um passeio.
low_rents

quase 10 anos depois: o mesmo! ou?
toing_toing

18

Aqui está um bom artigo que mostra muitas maneiras de ocultar arquivos dos mecanismos de pesquisa:

http://antezeta.com/news/avoid-search-engine-indexing

JavaScript não é uma boa maneira de não indexar uma página; isso não impedirá que os usuários se vinculem diretamente aos seus arquivos (e assim revelando-os aos rastreadores) e, como Rob mencionou, não funcionaria para todos os usuários.
Uma solução fácil é adicionar o rel="nofollow"atributo, embora, novamente, ele não esteja completo sem o robots.txt.

<a href="uploads/file.doc" rel="nofollow">Download Here</a>

2
Aqui está outro artigo da Ajuda do Google para webmasers que me ajuda muito a entender o rel "nofollow" ou "me".
000

12

Sim, você teria que alterar o window.location.href para o url do arquivo que deseja baixar.

window.location.href = 'http://www.com/path/to/file';

e se a extensão do arquivo for .html, em vez de baixá-lo irá redirecionar para esse arquivo html
Kaleem Nalband

9
 var link=document.createElement('a');
 document.body.appendChild(link);
 link.href=url;
 link.click();

nenhum erro, apenas o download não estava iniciando. Eu acho que talvez haja algum ponto que esteja faltando ao criar o elemento.
shyammakwana.me

verifique em seu html se um elemento <a> foi criado ou não e verifique o link do arquivo.
EL missaoui habib

uma etiqueta estava lá, no corpo. e clicando manualmente é o download da imagem. no entanto, não é necessário agora, usei essa solução vanillaJS.
shyammakwana.me

não há razão para não funcionar se o link estiver correto. teste o link direto no
navegador

$('blah').each(function(){ $('body').append('<a href="'+xxx+'" download="'+dynamicname+'" />'); }) $('a').trigger('click');eu usei isso.
shyammakwana.me

7
  • Usando a função jQuery

        var valFileDownloadPath = 'http//:'+'your url';
    
       window.open(valFileDownloadPath , '_blank');

6

Ao declarar, window.location.href = 'uploads/file.doc';você mostra onde armazena seus arquivos. É claro que você pode usar .htacess para forçar o comportamento necessário para arquivos armazenados, mas isso nem sempre pode ser difícil ....

É melhor criar um arquivo php do lado do servidor e colocar este conteúdo nele:

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$_REQUEST['f']);
readfile('../some_folder/some_subfolder/'.$_REQUEST['f']); 
exit;

Este código retornará QUALQUER arquivo como um download sem mostrar onde você realmente o armazenou.

Você abre este arquivo php via window.location.href = 'scripts/this_php_file.php?f=downloaded_file';


Essa solução me ajudou a corrigir os problemas de download em meu site, obrigado!
Denniz

3

Iframes ocultos podem ajudar


var redeemFrame = document.createElement ("iframe"); var src = "doDownload.php"; redeemFrame.setAttribute ("src", src); redeemFrame.setAttribute ("style", "display: none"); document.body.appendChild (redeemFrame);
DarthRez

3

Eu sugiro que você use o evento mousedown, que é chamado ANTES do evento de clique. Dessa forma, o navegador lida com o evento de clique naturalmente, o que evita qualquer estranheza do código:

(function ($) {


    // with this solution, the browser handles the download link naturally (tested in chrome and firefox)
    $(document).ready(function () {

        var url = '/private/downloads/myfile123.pdf';
        $("a").on('mousedown', function () {
            $(this).attr("href", url);
        });

    });
})(jQuery);

0

Veja aqui uma postagem semelhante sobre como usar jQuery para limpar formulários: Redefinindo um formulário de vários estágios com jQuery

Você também pode estar tendo um problema em que os valores estão sendo preenchidos pela pilha de valores do struts. Em outras palavras, você envia seu formulário, faz tudo na classe de ação, mas não limpa os valores dos campos relacionados na classe de ação. Nesse cenário, o formulário parece manter os valores que você enviou anteriormente. Se você estiver persistindo de alguma forma, apenas anule cada valor de campo em sua classe de ação após persistir e antes de retornar SUCCESS.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.