Как запустить автоматическую загрузку файла в Internet Explorer?

Как инициализировать автоматическую загрузку файла в Internet Explorer?

Например, на странице загрузки я хочу, чтобы появилась ссылка для загрузки и сообщение: «Если загрузка не начинается автоматически… и т. д.». Загрузка должна начаться вскоре после загрузки страницы.

В Firefox это просто, вам просто нужно включить метатег в заголовок, <meta http-equiv = "Refresh" content = "n;url">, где n - количество секунд, а url - это URL-адрес загрузки. Это не работает в Internet Explorer. Как мне заставить это работать в браузерах Internet Explorer?

есть идеи, как это сделать в хроме?

iDebD_gh 24.04.2014 12:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
73
1
281 918
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Недавно я решил это, разместив на странице следующий скрипт.

setTimeout(function () { window.location = 'my download url'; }, 5000)

Я согласен с тем, что мета-обновление было бы лучше, но если это не сработает, что вы делаете ...

должен быть setTimeout(function () { window.location = 'my download url'; }, 5000) (пожалуйста, без строк для setTimeout)

Shrikant Sharat 18.11.2010 13:00

@Cerberus: из-за общей идеи.

Ralph 27.12.2012 17:45

Наверное, самое простое решение.

George Sovetov 11.07.2014 22:47

или вставьте в следующий код, например: Page.ClientScript.RegisterStartupScript (Me.GetType, "filedownload", "setTimeout (function () {window.location = 'http: //" & Page.Request.Url.Authority & filename & "';}, 0)", Истина)

user890332 04.12.2015 00:39
Ответ принят как подходящий

SourceForge использует элемент <iframe> с атрибутом src = "", указывающим на файл для загрузки.

<iframe width = "1" height = "1" frameborder = "0" src = "[File location]"></iframe>

(Побочный эффект: нет перенаправления, нет JavaScript, исходный URL-адрес остается неизменным.)

Может кто-нибудь объяснить, как это должно работать? Я не вижу задержки на n секунд ... Заранее спасибо.

Budda 11.08.2010 00:08

По-видимому, именно так это и делает audible.com.

3on 01.07.2013 02:41

Ох, это умно. Вы также можете сделать его display:none. Кроме того, @Budda, какой-нибудь простой Javascript (О, нет, Javascript?!?!) Может добавить этот HTML через n секунд: HTML: <iframe id = "download" width = "1" height = "1" style = "display:none"></iframe> Javascript: function startDownload () { document.getElementById("download").src = "[File Location]"; } setTimeout (startDownload, n * 1000);

Cosine 02.09.2013 04:41

Блестяще! Спасибо за совет!

Dmitriy Konovalov 30.10.2013 15:15

Мне нравится идея использовать это, но у него будут проблемы с некоторыми типами файлов. Например, если вы хотите предоставить ссылку для загрузки для PDF-файла или изображения (или любого контента, который может отображать браузер), браузер просто попытается отобразить его в скрытом окне iframe.

Nathan Hornby 04.12.2014 17:41

@NathanHornby, используйте заголовок Content-Disposition: attachment; filename=manual.pdf на стороне сервера, и все будет в порядке.

zealotous 14.01.2015 16:39

Как подать заявку в IE 11, я действительно понятия не имею, может ли кто-нибудь поделиться со мной?

Shi Jie Tio 19.06.2017 10:37

IE: указание iframe на src stackoverflow.com/questions/24529910/… (Cendak) решило это для меня.

Teson 29.06.2017 10:45

@zealotous Где на сервере ставишь Content-Disposition: attachment; filename=manual.pdf header on server side?

johny why 29.04.2020 01:25

Убедитесь, что файл без содержит заголовок без кеширования! У IE возникают проблемы с этим, если пользователь пытается «открыть» загрузку без предварительного сохранения.

У меня ненавидеть когда сайты так сильно затрудняют загрузку и используйте хаки вместо старой доброй ссылки.

Мертвая простая версия:

<a href = "file.zip">Start automatic download!</a>

Оно работает! В каждом браузере!


Если вы хотите загрузить файл, который обычно отображается встроенным (например, изображение), тогда HTML5 имеет атрибут download, который принудительно загружает файл. Это также позволяет вам переопределить имя файла (хотя есть способ сделать это лучше):

<a href = "report-generator.php" download = "result.xls">Download</a>

Версия со страницей благодарности:

Если вы хотите, чтобы после загрузки отображалось «спасибо», используйте:

<a href = "file.zip" 
   onclick = "if (event.button==0) 
     setTimeout(function(){document.body.innerHTML='thanks!'},500)">
 Start automatic download!
</a>

Функция в этом setTimeout может быть более продвинутой и, например, загрузить всю страницу через AJAX (но не уходите со страницы - не трогайте window.location и не активируйте другие ссылки).

Дело в том, что ссылка для загрузки настоящая, ее можно скопировать, перетащить, перехватить ускорителями загрузки, она приобретает цвет :visited, не загружается повторно, если страница остается открытой после перезапуска браузера и т. д.

Вот что я использую для ImageOptim

Мне нравится простота вашего ответа.

David Robbins 23.05.2009 14:05

@DavidRobbins и мне нравится простота вашего комментария. : D

Vishwanath Dalvi 31.08.2012 15:03

Одно предостережение. По крайней мере, в моем Chrome 21 попытка следовать @href отменяется, если сценарий из setTimeout пытается перейти на другую страницу. Так что это действительно работает только тогда, когда вы можете показать страницу благодарности встроенной.

Kohsuke Kawaguchi 27.10.2012 21:32

Я полностью согласен с использованием старой доброй ссылки, но здесь есть проблема: клиенты. Иногда они хотят того, чего хотят, независимо от того, что вы им пытаетесь сказать. Они видели это на других сайтах, и это то, что они хотят на своем сайте.

raydowe 29.01.2013 19:44

@raydowe, если вы заставите ссылку работать хорошо, то клиент не узнает. Если у вас нет клиентов, которые просматривают исходный код страницы и подают бессмысленные жалобы…

Kornel 29.01.2013 19:45

@porneL Я не понимаю. Я думал, вы предлагаете просто использовать ссылку на файл ВМЕСТО автоматической загрузки через X секунд.

raydowe 29.01.2013 19:49

@raydowe да, но вы можете отобразить экран после загрузки, который выглядит так же, как если бы он был реализован с помощью беспорядочного взлома meta / iframe - загрузите страницу с благодарностью с помощью AJAX из обработчика onclick. Поэтому, если клиенту требуется такая страница, вы можете использовать ссылку и при этом выполнить требование.

Kornel 29.01.2013 22:15

В настоящее время проблема заключается в сафари, обратите внимание, что пользователь хочет автоматически начать загрузку, и единственный способ сделать это с помощью ссылки - это зацепить элемент и вызвать .click (). safari не поддерживает click ().

Cheruvian 11.11.2014 03:07

@Cheruvian подумайте, какое действие предпримет пользователь, прежде чем вы "автоматически" начнете загрузку. Готов поспорить, что это действие - это щелчок, который ведет на вашу "автоматическую" страницу. Так что переместите загрузку на шаг раньше!

Kornel 12.11.2014 02:55

Верно, но проблема в том, что вам нужно сгенерировать загружаемый контент на основе чего-то. Текущее решение - 1 щелчок для создания контента и 1 щелчок для загрузки, что может быть довольно грязным.

Cheruvian 12.11.2014 03:39

Часто вам нужно проделать дополнительную работу до фактического начала загрузки - например, отправить различные параметры из JS в API, чтобы вы могли подготовить файл для загрузки. Вы действительно не можете этого сделать, если пользователь щелкает только href, который ссылается непосредственно на содержимое файла.

Bogdan Varlamov 08.01.2015 22:21

@BogdanVarlamov: вы можете включить данные в URL-адрес (при необходимости динамически изменить href) и перенаправить этот URL-адрес на фактический файл, например <a href = "/api?param=meters&redirect=/download/file">. Вы даже можете изменить href из обработчика onclick и вернуть true, так что вы можете обновить его, когда пользователь щелкнет мышью.

Kornel 09.01.2015 23:01

@porneL: тогда потенциально конфиденциальные данные отправляются небезопасным образом (через URL-адрес) вместо того, чтобы отправлять их в теле через HTTPS.

Bogdan Varlamov 23.01.2015 04:50

@BogdanVarlamov HTTPS - это туннель, скрывающий весь протокол HTTP, включая URL-адреса, поэтому нет никакой разницы. И если имя файла содержит конфиденциальную информацию, может быть, все равно не помещать это в имя файла? (он просочится позже при сохранении на диск)

Kornel 23.01.2015 15:19

Есть некоторые проблемы, связанные с URL-адресами, которые обычно не встречаются для параметров тела. Проверьте stackoverflow.com/questions/323200/… и blog.httpwatch.com/2009/02/20/… по причинам

Bogdan Varlamov 03.02.2015 23:13

@BogdanVarlamov 1. ПОЛУЧИТЬ через щелчок или ПОЛУЧИТЬ через javascript / iframe. Взлом по-прежнему остается GET (и такие проблемы, как утечка межсайтового реферера, не относятся к ссылкам для скачивания, которые вы создаете). 2. конфиденциальная информация должна поступать в cookie с флагом secure, и тогда вам не нужно будет беспокоиться о том, чтобы скрыть потенциально небезопасные взломы URL-адресов с помощью ненадежных JS-хаков.

Kornel 04.02.2015 15:09

@porneL, никто не заставляет использовать в JS метод GET. Вы можете (и должны) использовать POST / PUT для отправки конфиденциальных параметров в JS в BODY (см. Мои первые комментарии) ... щелчком по URL-адресу вы ограничены только GET, который отправляет браузер.

Bogdan Varlamov 10.02.2015 02:01

@BogdanVarlamov Вы все еще можете использовать <form method = "post"><button> для эквивалента <a href> без взлома JS. Другие ответы на этот вопрос используют фреймы или location.href и в любом случае не учитывают POST.

Kornel 10.02.2015 19:17

@porneL, я думаю, что я представляю себе POST / PUT, который отправляет конфиденциальную информацию, которая возвращает URL-адрес на основе тех критериев, которые вы отправили, на который затем клиент JS перенаправляется для выполнения загрузки файла. Вы можете избежать этого, вставив конфиденциальную информацию в URL-адрес в качестве параметров, конечно, но, как я указал, это имеет проблемы с безопасностью. Вы говорите, что если бы у вас была форма для отправки параметров, вы могли бы перенаправить сервер в нужный файл на основе параметров?

Bogdan Varlamov 11.02.2015 00:16

@BogdanVarlamov POST может отправить файл для загрузки напрямую, поэтому нет необходимости выполнять перенаправление или указывать какие-либо параметры в любом URL-адресе в любой момент, например см. imageoptim.com/mozjpeg

Kornel 11.02.2015 02:10

Почему Content-Disposition лучше, чем атрибут download для установки имени файла?

Robo Robok 19.03.2018 19:02

Мне показалось, что это сработало во всех браузерах.

 <script type = "text/javascript">
    window.onload = function(){
     document.location = 'somefile.zip';
    }
    </script>

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

Budda 09.08.2010 21:08

За исключением некоторых браузеров + контент, который можно просматривать непосредственно в браузере (например, видеофайлы), на самом деле не сила загрузки при любых обстоятельствах.

mix3d 08.09.2019 08:50

Простая часть jQuery решила за меня эту проблему.

$(function() {
   $(window).bind('load', function() {
      $("div.downloadProject").delay(1500).append('<iframe width = "0" height = "0" frameborder = "0" src = "[YOUR FILE SRC]"></iframe>'); 
   });
});

В моем HTML я просто

<div class = "downloadProject"></div>

Все, что нужно сделать, это подождать полторы секунды, а затем добавить div с iframe, ссылающимся на файл, который вы хотите загрузить. Когда iframe обновляется на странице, ваш браузер загружает файл. Просто как тот. : D

Я думаю, это сработает для вас. Но с посетителями легко, если они получили что-то за секунды, не тратя больше времени, и, следовательно, они также снова посетят ваш сайт. <a href = "file.zip" onclick = "if (event.button==0) setTimeout(function(){document.body.innerHTML='thanks!'},500)"> Start automatic download! </a>

У меня была аналогичная проблема, и ни одно из вышеперечисленных решений не помогло мне. Вот моя попытка (требуется jquery):

$(function() {
  $('a[data-auto-download]').each(function(){
    var $this = $(this);
    setTimeout(function() {
      window.location = $this.attr('href');
    }, 2000);
  });
});

Использование: просто добавьте атрибут data-auto-download к ссылке, указывающей на загрузку, о которой идет речь:

<p>The download should start shortly. If it doesn't, click
<a data-auto-download href = "/your/file/url">here</a>.</p>

Он должен работать во всех случаях.

Мне нравится это. Красиво и чисто, и вы можете добавить его по любой ссылке. Я люблю находить новые интересные применения для атрибута data-*!

daGUY 29.10.2012 20:48

Я проверил и обнаружил, что он будет работать при нажатии кнопки, записывая событие onclick в тег привязки или кнопку ввода.

onclick='javascript:setTimeout(window.location=[File location], 1000);'

Я использовал это, похоже, работает, и это просто JS, без фреймворка:

Your file should start downloading in a few seconds. 
If downloading doesn't start automatically
<a id = "downloadLink" href = "[link to your file]">click here to get your file</a>.

<script> 
    var downloadTimeout = setTimeout(function () {
        window.location = document.getElementById('downloadLink').href;
    }, 2000);
</script>

ПРИМЕЧАНИЕ: тайм-аут начинается в момент загрузки страницы.

Что касается вашего флага, это можно было бы поднять на нашем сайте мета. Однако я считаю, что это возникало раньше (есть довольно много похожих жалоб, но я не могу найти ни одной, прямо соответствующей этому)

Tim Post 04.10.2012 07:45

Это то, что я использую на некоторых сайтах (требуется jQuery):

$(document).ready(function() {
    var downloadUrl = "your_file_url";
    setTimeout("window.location.assign('" + downloadUrl + "');", 1000);
});

Файл загружается автоматически через 1 секунду.

Для тех, кто пытается запустить загрузку с помощью динамическая ссылка, сложно заставить его работать в разных браузерах.

У меня были проблемы с IE10 + при загрузке PDF-файла, и я использовал функцию @dandavis 'download (https://github.com/rndme/download).

IE10 + требует msSaveBlob.

Вернемся к корням, я использую это:

<meta http-equiv = "refresh" content = "0; url=YOURFILEURL"/>

Возможно, не соответствует требованиям WC3, но отлично работает во всех браузерах, без HTML5 / JQUERY / Javascript.

Привет Том :)

Работает в Chrome, firefox и IE8 и выше:

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

работает в firefox, только если это ссылка для скачивания из того же источника

ash123 14.04.2017 18:11

@ ash123 попробуйте следующее: function downloadURI (uri, name) {var link = document.createElement ("a"); link.download = имя; link.href = uri; link.click (); }

EL missaoui habib 16.04.2017 20:26

Я надеюсь, что это будет работать во всех браузерах. Вы также можете установить время автоматической загрузки.

<html>
<head>
<title>Start Auto Download file</title>
<script src = "http://code.jquery.com/jquery-3.2.1.min.js"></script>
<script>
$(function() {
$('a[data-auto-download]').each(function(){
var $this = $(this);
setTimeout(function() {
window.location = $this.attr('href');
}, 2000);
});
});
</script>
</head>
<body>
<div class = "wrapper">
<p>The download should start shortly. If it doesn't, click
<a data-auto-download href = "auto-download.zip">here</a>.</p>
</div>
</body>
</html>

Демо здесь

Этот ответ спасает мне день. У меня есть дополнительный вопрос: если я изменю "auto-download.zip" на URL-адрес типа stackoverflow.com/questions/156686/…, он не сработает. Моя цель - загрузить страницу stackoverflow как html.

halfmoonhalf 18.07.2020 10:58

Хорошее решение jquery:

jQuery('a.auto-start').get(0).click();

Вы даже можете установить другое имя файла для загрузки внутри тега <a>:

Your download should start shortly. If not - you can use
<a href = "/attachments-31-3d4c8970.zip" download = "attachments-31.zip" class = "download auto-start">direct link</a>.

Не все браузеры позволяют щелкнуть тег привязки с помощью JS. Safari, например, особенно если URL-адрес является междоменным.

mix3d 08.09.2019 08:52

Еще :

var a = document.createElement('a');
a.setAttribute('href', dataUri);
a.setAttribute('download', filename);

var aj = $(a);
aj.appendTo('body');
aj[0].click();
aj.remove();

<meta http-equiv = "Refresh" content = "n;url">

Это оно. Легко, правда?

<meta http-equiv = "Refresh" content = "n;url">

Другие вопросы по теме