Скачать файл с помощью jQuery

Как я могу запросить загрузку для пользователя, когда он щелкнет ссылку.

Например, вместо:

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

Я мог бы использовать:

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

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

Таким образом, Google не индексирует мои HREF и личные файлы.

Можно ли это сделать с помощью jQuery, если да, то как? Или это должно быть сделано с помощью PHP или чего-то такого?


person Dodinas    schedule 18.08.2009    source источник
comment
Возможный дубликат Загрузить файл с помощью Javascript / jQuery   -  person Liam    schedule 11.05.2016


Ответы (11)


Я мог бы предложить это в качестве более изящного деградирующего решения, используя _1 _:

$('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>

Даже если нет Javascript, по крайней мере, так пользователь получит некоторую обратную связь.

person karim79    schedule 18.08.2009
comment
Спасибо, это то, что я искал. Я обычно использую preventDefault, просто оставил его выше, потому что я был ленив. ;-) - person Dodinas; 19.08.2009
comment
Отлично работает, но возникают ошибки типа MIME. Интересно, есть ли способы их обойти? - person Nathan Hangen; 31.12.2012
comment
Решили ли вы предупреждение типа MIME? Я получаю ресурс, интерпретируемый как документ, но переданный с типом MIME ... Большое спасибо. - person user1824269; 16.01.2013

Если вы не хотите, чтобы поисковые системы индексировали определенные файлы, вы можете использовать robots.txt чтобы запретить веб-паукам получать доступ к определенным частям вашего сайта.

Если вы полагаетесь только на javascript, то некоторые пользователи, просматривающие без него, не смогут нажимать на ваши ссылки.

person Rob    schedule 18.08.2009
comment
Полезно знать о файле robots.txt. Спасибо. - person Dodinas; 19.08.2009
comment
@Rob, если вам нужно, чтобы URL-адреса были закрытыми, robots.txt не поможет, потому что он все равно будет храниться в истории браузера и на промежуточных серверах. - person Pacerier; 04.03.2015
comment
6 лет спустя: просмотр без javascript? - ну, можно было бы и погулять. - person low_rents; 29.07.2015
comment
почти 10 лет спустя: то же самое! или ? - person toing_toing; 06.05.2019

Вот хорошая статья, в которой показано множество способов скрыть файлы от поисковых систем:

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

JavaScript - не лучший способ не индексировать страницу; это не помешает пользователям напрямую ссылаться на ваши файлы (и, таким образом, открывать их для сканеров), и, как сказал Роб, не будет работать для всех пользователей.
Простое решение - добавить атрибут rel="nofollow", хотя, опять же, это не обходится без robots.txt.

<a href="uploads/file.doc" rel="nofollow">Download Here</a>
person Kobi    schedule 18.08.2009
comment
Вот еще одна статья справки Google для веб-мастеров что очень помогает мне понять nofollow или me rel. - person 000; 07.02.2011

Да, вам придется изменить window.location.href на URL-адрес файла, который вы хотите загрузить.

window.location.href = 'http://www.com/path/to/file';
person MacAnthony    schedule 18.08.2009
comment
что, если расширение файла .html, вместо загрузки он перенаправит на этот html-файл - person Kaleem Nalband; 02.03.2020

  • Использование функции jQuery

        var valFileDownloadPath = 'http//:'+'your url';
    
       window.open(valFileDownloadPath , '_blank');
    
person Ganganath Rathnasekara    schedule 17.08.2017
comment
Привет, это откроет новую вкладку, как, если не хотите открывать новую вкладку, просто прямую загрузку при нажатии? уже удалили _blank, но никаких действий. - person mastersuse; 18.03.2021

Указав window.location.href = 'uploads/file.doc';, вы показываете, где вы храните свои файлы. Вы, конечно, можете использовать .htacess для принудительного выполнения требуемого поведения для сохраненных файлов, но это не всегда может быть удобно ....

Лучше создать php-файл на стороне сервера и поместить в него такой контент:

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

Этот код вернет ЛЮБОЙ файл в качестве загрузки, не показывая, где вы его фактически храните.

Вы открываете этот php-файл через window.location.href = 'scripts/this_php_file.php?f=downloaded_file';

person Otvazhnii    schedule 02.01.2014
comment
Это решение помогло мне исправить проблемы с загрузкой на моем сайте, спасибо! - person Denniz; 06.12.2017
comment
Большое спасибо, ваш ответ решил мою проблему! Слишком много ссылок, которые я пробовал, но ничего не помогло. - person mastersuse; 18.03.2021

Скрытые окна iframe могут помочь

person letronje    schedule 20.09.2010
comment
var redeemFrame = document.createElement (iframe); var src = doDownload.php; redeemFrame.setAttribute (src, src); redeemFrame.setAttribute (стиль, отображение: нет); document.body.appendChild (redeemFrame); - person DarthRez; 07.01.2018

Я предлагаю вам использовать событие mousedown, которое вызывается ПЕРЕД событием щелчка. Таким образом, браузер естественным образом обрабатывает событие щелчка, что позволяет избежать странностей в коде:

(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);
person ling    schedule 18.10.2014

См. Здесь аналогичное сообщение об использовании jQuery для очистки форм: Сброс многоступенчатой ​​формы с помощью jQuery

Вы также можете столкнуться с проблемой, когда значения повторно заполняются стеком значений struts. Другими словами, вы отправляете свою форму, делаете все, что в классе действия, но не очищаете значения связанных полей в классе действия. В этом сценарии форма будет содержать значения, которые вы отправили ранее. Если вы каким-то образом сохраняете их, просто обнуляйте каждое значение поля в своем классе действий после сохранения и до возврата УСПЕХ.

person Russell Shingleton    schedule 04.08.2011

Вы можете сделать это с помощью html5 очень легко:

var link = document.createElement('a');
link.href = "/WWW/test.pdf";
link.download = "file_" + new Date() + ".pdf";
link.click();
link.remove();
person Luca Ziegler    schedule 09.06.2021

person    schedule
comment
ошибки нет, просто загрузка не началась. Я думаю, что может быть какой-то момент, который мне не хватает при создании элемента. - person shyammakwana.me; 24.06.2016
comment
проверьте в своем HTML, был ли создан элемент ‹a› или нет, и проверьте ссылку на файл. - person EL missaoui habib; 24.06.2016
comment
бирка была там, в теле. и вручную щелкнув его загрузку изображения. однако сейчас это не нужно, я использовал это решение vanillaJS. - person shyammakwana.me; 24.06.2016
comment
нет причин не работать, ссылка верна. проверить ссылку прямо в браузере - person EL missaoui habib; 24.06.2016
comment
$('blah').each(function(){ $('body').append('<a href="'+xxx+'" download="'+dynamicname+'" />'); }) $('a').trigger('click'); я использовал это. - person shyammakwana.me; 24.06.2016
comment
добавить этот документ .body.appendChild (ссылка); - person EL missaoui habib; 28.06.2016
comment
Это сработало для меня, но мне пришлось добавить link.download = ${file name to download}, потому что в противном случае мне выдавалась ошибка - person Gregorio Freidin; 28.08.2020