Завантажте файл за допомогою 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, принаймні таким чином користувач отримає певний відгук.


20
jQuery - це відповідь.
Естебан Кюбер

Спасибі, це те, що я шукав. Зазвичай я використовую "prevenDefault", просто лишив його вище, тому що я лінивий. ;-)
Додінас

2
Чудово працює, але отримуйте деякі помилки типу MIME. Цікаво, чи є способи подолати їх?
Натан Ханген

2
Ви вирішили попередження типу MIME? Я отримую "Ресурс трактується як Документ, але передається з типом MIME ..." Дякую.
користувач1824269

22

Якщо ви не хочете, щоб пошукові системи індексували певні файли, ви можете використовувати robots.txt, щоб повідомити веб-павукам не отримувати доступ до певних частин вашого веб-сайту.

Якщо ви покладаєтесь лише на JavaScript, то деякі користувачі, які переглядають без нього, не зможуть натискати ваші посилання.


1
Корисно знати про "robots.txt". Дякую.
Додінас

@Rob. Якщо вам потрібні "приватні" URL-адреси, robots.txtце не допоможе, оскільки вони все ще зберігатимуться в історії браузера та посередницьких серверах.
Pacerier

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" або "me" rel.
000

12

Так, вам доведеться змінити window.location.href на URL файлу, який ви хочете завантажити.

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

Що робити, якщо розширення файлу .html, замість завантаження переспрямується на той html-файл
Kaleem Nalband

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

немає причин для того, щоб не працювати, чи правильне посилання. перевірити посилання прямо в перегляді
EL missaoui habib

$('blah').each(function(){ $('body').append('<a href="'+xxx+'" download="'+dynamicname+'" />'); }) $('a').trigger('click');я використав це.
shyammakwana.me


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

Я пропоную вам скористатися подією 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

Ви також можете зіткнутися з проблемою, у якій значення переносяться стеком значень стійок. Іншими словами, ви подаєте свою форму, виконайте все, що завгодно в класі дій, але не очищайте пов’язані значення поля в класі дій. У цьому сценарії форма може відображати значення, які ви подали раніше. Якщо ви зберігаєте їх певним чином, просто скасуйте значення кожного поля у вашому класі дій після збереження та перед поверненням SUCCESS.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.