Как инициализировать автоматическую загрузку файла в Internet Explorer?
Например, на странице загрузки я хочу, чтобы появилась ссылка для загрузки и сообщение: «Если загрузка не начинается автоматически… и т. д.». Загрузка должна начаться вскоре после загрузки страницы.
В Firefox это просто, вам просто нужно включить метатег в заголовок, <meta http-equiv = "Refresh" content = "n;url">, где n - количество секунд, а url - это URL-адрес загрузки. Это не работает в Internet Explorer. Как мне заставить это работать в браузерах Internet Explorer?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Недавно я решил это, разместив на странице следующий скрипт.
setTimeout(function () { window.location = 'my download url'; }, 5000)
Я согласен с тем, что мета-обновление было бы лучше, но если это не сработает, что вы делаете ...
должен быть setTimeout(function () { window.location = 'my download url'; }, 5000) (пожалуйста, без строк для setTimeout)
@Cerberus: из-за общей идеи.
Наверное, самое простое решение.
или вставьте в следующий код, например: Page.ClientScript.RegisterStartupScript (Me.GetType, "filedownload", "setTimeout (function () {window.location = 'http: //" & Page.Request.Url.Authority & filename & "';}, 0)", Истина)
SourceForge использует элемент <iframe> с атрибутом src = "", указывающим на файл для загрузки.
<iframe width = "1" height = "1" frameborder = "0" src = "[File location]"></iframe>
(Побочный эффект: нет перенаправления, нет JavaScript, исходный URL-адрес остается неизменным.)
Может кто-нибудь объяснить, как это должно работать? Я не вижу задержки на n секунд ... Заранее спасибо.
По-видимому, именно так это и делает audible.com.
Ох, это умно. Вы также можете сделать его 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);
Блестяще! Спасибо за совет!
Мне нравится идея использовать это, но у него будут проблемы с некоторыми типами файлов. Например, если вы хотите предоставить ссылку для загрузки для PDF-файла или изображения (или любого контента, который может отображать браузер), браузер просто попытается отобразить его в скрытом окне iframe.
@NathanHornby, используйте заголовок Content-Disposition: attachment; filename=manual.pdf на стороне сервера, и все будет в порядке.
Как подать заявку в IE 11, я действительно понятия не имею, может ли кто-нибудь поделиться со мной?
IE: указание iframe на src stackoverflow.com/questions/24529910/… (Cendak) решило это для меня.
@zealotous Где на сервере ставишь Content-Disposition: attachment; filename=manual.pdf header on server side?
Убедитесь, что файл без содержит заголовок без кеширования! У 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
Мне нравится простота вашего ответа.
@DavidRobbins и мне нравится простота вашего комментария. : D
Одно предостережение. По крайней мере, в моем Chrome 21 попытка следовать @href отменяется, если сценарий из setTimeout пытается перейти на другую страницу. Так что это действительно работает только тогда, когда вы можете показать страницу благодарности встроенной.
Я полностью согласен с использованием старой доброй ссылки, но здесь есть проблема: клиенты. Иногда они хотят того, чего хотят, независимо от того, что вы им пытаетесь сказать. Они видели это на других сайтах, и это то, что они хотят на своем сайте.
@raydowe, если вы заставите ссылку работать хорошо, то клиент не узнает. Если у вас нет клиентов, которые просматривают исходный код страницы и подают бессмысленные жалобы…
@porneL Я не понимаю. Я думал, вы предлагаете просто использовать ссылку на файл ВМЕСТО автоматической загрузки через X секунд.
@raydowe да, но вы можете отобразить экран после загрузки, который выглядит так же, как если бы он был реализован с помощью беспорядочного взлома meta / iframe - загрузите страницу с благодарностью с помощью AJAX из обработчика onclick. Поэтому, если клиенту требуется такая страница, вы можете использовать ссылку и при этом выполнить требование.
В настоящее время проблема заключается в сафари, обратите внимание, что пользователь хочет автоматически начать загрузку, и единственный способ сделать это с помощью ссылки - это зацепить элемент и вызвать .click (). safari не поддерживает click ().
@Cheruvian подумайте, какое действие предпримет пользователь, прежде чем вы "автоматически" начнете загрузку. Готов поспорить, что это действие - это щелчок, который ведет на вашу "автоматическую" страницу. Так что переместите загрузку на шаг раньше!
Верно, но проблема в том, что вам нужно сгенерировать загружаемый контент на основе чего-то. Текущее решение - 1 щелчок для создания контента и 1 щелчок для загрузки, что может быть довольно грязным.
Часто вам нужно проделать дополнительную работу до фактического начала загрузки - например, отправить различные параметры из JS в API, чтобы вы могли подготовить файл для загрузки. Вы действительно не можете этого сделать, если пользователь щелкает только href, который ссылается непосредственно на содержимое файла.
@BogdanVarlamov: вы можете включить данные в URL-адрес (при необходимости динамически изменить href) и перенаправить этот URL-адрес на фактический файл, например <a href = "/api?param=meters&redirect=/download/file">. Вы даже можете изменить href из обработчика onclick и вернуть true, так что вы можете обновить его, когда пользователь щелкнет мышью.
@porneL: тогда потенциально конфиденциальные данные отправляются небезопасным образом (через URL-адрес) вместо того, чтобы отправлять их в теле через HTTPS.
@BogdanVarlamov HTTPS - это туннель, скрывающий весь протокол HTTP, включая URL-адреса, поэтому нет никакой разницы. И если имя файла содержит конфиденциальную информацию, может быть, все равно не помещать это в имя файла? (он просочится позже при сохранении на диск)
Есть некоторые проблемы, связанные с URL-адресами, которые обычно не встречаются для параметров тела. Проверьте stackoverflow.com/questions/323200/… и blog.httpwatch.com/2009/02/20/… по причинам
@BogdanVarlamov 1. ПОЛУЧИТЬ через щелчок или ПОЛУЧИТЬ через javascript / iframe. Взлом по-прежнему остается GET (и такие проблемы, как утечка межсайтового реферера, не относятся к ссылкам для скачивания, которые вы создаете). 2. конфиденциальная информация должна поступать в cookie с флагом secure, и тогда вам не нужно будет беспокоиться о том, чтобы скрыть потенциально небезопасные взломы URL-адресов с помощью ненадежных JS-хаков.
@porneL, никто не заставляет использовать в JS метод GET. Вы можете (и должны) использовать POST / PUT для отправки конфиденциальных параметров в JS в BODY (см. Мои первые комментарии) ... щелчком по URL-адресу вы ограничены только GET, который отправляет браузер.
@BogdanVarlamov Вы все еще можете использовать <form method = "post"><button> для эквивалента <a href> без взлома JS. Другие ответы на этот вопрос используют фреймы или location.href и в любом случае не учитывают POST.
@porneL, я думаю, что я представляю себе POST / PUT, который отправляет конфиденциальную информацию, которая возвращает URL-адрес на основе тех критериев, которые вы отправили, на который затем клиент JS перенаправляется для выполнения загрузки файла. Вы можете избежать этого, вставив конфиденциальную информацию в URL-адрес в качестве параметров, конечно, но, как я указал, это имеет проблемы с безопасностью. Вы говорите, что если бы у вас была форма для отправки параметров, вы могли бы перенаправить сервер в нужный файл на основе параметров?
@BogdanVarlamov POST может отправить файл для загрузки напрямую, поэтому нет необходимости выполнять перенаправление или указывать какие-либо параметры в любом URL-адресе в любой момент, например см. imageoptim.com/mozjpeg
Почему Content-Disposition лучше, чем атрибут download для установки имени файла?
Мне показалось, что это сработало во всех браузерах.
<script type = "text/javascript">
window.onload = function(){
document.location = 'somefile.zip';
}
</script>
Недостаток такого подхода в том, что браузер ждет загрузки всех баннеров ... Иногда это занимает некоторое время, и пользователь не может получить файл из-за глупых баннеров ...
За исключением некоторых браузеров + контент, который можно просматривать непосредственно в браузере (например, видеофайлы), на самом деле не сила загрузки при любых обстоятельствах.
Простая часть 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-*!
Я проверил и обнаружил, что он будет работать при нажатии кнопки, записывая событие 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>
ПРИМЕЧАНИЕ: тайм-аут начинается в момент загрузки страницы.
Что касается вашего флага, это можно было бы поднять на нашем сайте мета. Однако я считаю, что это возникало раньше (есть довольно много похожих жалоб, но я не могу найти ни одной, прямо соответствующей этому)
Это то, что я использую на некоторых сайтах (требуется 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 попробуйте следующее: function downloadURI (uri, name) {var link = document.createElement ("a"); link.download = имя; link.href = uri; link.click (); }
Я надеюсь, что это будет работать во всех браузерах. Вы также можете установить время автоматической загрузки.
<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.
Хорошее решение 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-адрес является междоменным.
Еще :
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">
есть идеи, как это сделать в хроме?