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

113

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

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

<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 или чего-то такого?

Додинас
источник

Ответы:

165

Я мог бы предложить это как более изящное деградирующее решение, используя 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>

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

karim79
источник
20
jQuery - это ответ.
Эстебан Кюбер,
Спасибо, это то, что я искал. Обычно я использую "preventDefault", просто оставив его выше, потому что я был ленив. ;-)
Dodinas
2
Отлично работает, но возникают ошибки типа MIME. Интересно, есть ли способы их обойти?
Натан Ханген
2
Решили ли вы предупреждение типа MIME? Я получаю сообщение «Ресурс интерпретируется как документ, но передается с типом MIME ...» Большое спасибо.
user1824269
22

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

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

Роб
источник
1
Полезно знать о файле robots.txt. Спасибо.
Dodinas
@Rob, если вам нужно, чтобы URL-адреса были "частными", robots.txtэто не поможет, потому что они все равно будут храниться в истории браузера и на промежуточных серверах.
Pacerier 03
3
6 лет спустя: просмотр без javascript? - ну, можно было бы и погулять.
low_rents
почти 10 лет спустя: то же самое! или ?
toing_toing
18

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

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

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

<a href="uploads/file.doc" rel="nofollow">Download Here</a>
Коби
источник
2
Вот еще одна статья справки Google для веб-мастеров, которая очень помогает мне понять отношения «nofollow» или «я».
000
12

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

window.location.href = 'http://www.com/path/to/file';
МакЭнтони
источник
что, если расширение файла .html, вместо загрузки он будет перенаправлять на этот html-файл,
Калим Налбанд
9
 var link=document.createElement('a');
 document.body.appendChild(link);
 link.href=url;
 link.click();
Эль Миссауи Хабиб
источник
ошибки нет, просто загрузка не началась. Я думаю, что может быть какой-то момент, который мне не хватает при создании элемента.
shyammakwana.me
проверьте в своем html, был ли создан элемент <a> или нет, и проверьте ссылку на файл.
EL missaoui habib,
бирка была там, в теле. и вручную щелкнув его загрузку изображения. однако сейчас это не нужно, я использовал это решение vanillaJS.
shyammakwana.me
нет причин не работать, ссылка верна. проверить ссылку прямо в
браузере
$('blah').each(function(){ $('body').append('<a href="'+xxx+'" download="'+dynamicname+'" />'); }) $('a').trigger('click');я использовал это.
shyammakwana.me
7
  • Использование функции jQuery

        var valFileDownloadPath = 'http//:'+'your url';
    
       window.open(valFileDownloadPath , '_blank');
    
Ганганатх Ратнасекара
источник
6

Заявив, 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';

Отважный
источник
Это решение помогло мне исправить проблемы с загрузкой на моем сайте, спасибо!
Денниз
3

Скрытые фреймы могут помочь

Letronje
источник
var redeemFrame = document.createElement ("iframe"); var src = "doDownload.php"; redeemFrame.setAttribute ("SRC", SRC); redeemFrame.setAttribute ("стиль", "отображение: нет"); document.body.appendChild (redeemFrame);
DarthRez
3

Я предлагаю вам использовать событие 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);
лин
источник
0

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

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

Рассел Шинглтон
источник