Каков наилучший способ перекрестного браузера открыть диалоговое окно загрузки (предположим, что мы можем установить контент-размещение: вложение в заголовках), не переходя от текущей страницы или всплывающие окна, которые не работают в IE6.
Самый простой способ открыть окно загрузки без перехода от страницы
Ответ 1
Прошло 7 лет, хорошо. Я не знаю, работает ли это для IE6, но это вызывает OpenFileDialog в FF и Chrome.
var file_path = 'host/path/file.ext';
var a = document.createElement('A');
a.href = file_path;
a.download = file_path.substr(file_path.lastIndexOf('/') + 1);
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
Ответ 2
Этот javascript хорош, что он не открывает новое окно или вкладку.
window.location.assign(url);
Ответ 3
Я всегда добавляю ссылку target = "_ blank" в ссылку для загрузки. Это откроет новое окно, но как только пользователь нажмет на сохранение, новое окно будет закрыто.
Ответ 4
Поместите это в раздел HTML-заголовка, указав в url
-адресе URL файла, который нужно загрузить:
<script type="text/javascript">
function startDownload()
{
var url='http://server/folder/file.ext';
window.open(url, 'Download');
}
</script>
Затем поместите это в тело, которое начнет загрузку автоматически через 5 секунд:
<script type="text/javascript">
setTimeout('startDownload()', 5000); //starts download after 5 seconds
</script>
(Отсюда.)
Ответ 5
Я искал хороший способ использовать javascript для запуска загрузки файла, как и этот вопрос. Однако эти ответы не помогли. Затем я сделал некоторое тестирование xbrowser и обнаружил, что iframe работает лучше всего во всех современных браузерах IE > 8.
downloadUrl = "http://example.com/download/file.zip";
var downloadFrame = document.createElement("iframe");
downloadFrame.setAttribute('src',downloadUrl);
downloadFrame.setAttribute('class',"screenReaderText");
document.body.appendChild(downloadFrame);
class="screenReaderText"
- это мой класс для стильного контента, который присутствует, но не доступен для просмотра.
CSS
.screenReaderText {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
то же, что и .visiddenHidden в html5boilerplate
Я предпочитаю это для метода javascript window.open, потому что если ссылка сломана, метод iframe просто не делает ничего, а не перенаправляет на пустую страницу, говоря, что файл не может быть открыт.
window.open(downloadUrl, 'download_window', 'toolbar=0,location=no,directories=0,status=0,scrollbars=0,resizeable=0,width=1,height=1,top=0,left=0');
window.focus();
Ответ 6
Я знаю, что вопрос задавался 7 years and 9 months ago
но многие опубликованные решения, похоже, не работают, например, использование <iframe>
работает только с FireFox
и не работает с Chrome
.
Лучшее решение:
Лучшим рабочим решением для открытия всплывающего окна загрузки файла в JavaScript
является использование элемента HTML
ссылки, при этом нет необходимости добавлять элемент ссылки в document.body
как указано в других ответах.
Вы можете использовать следующую функцию:
function downloadFile(filePath){
var link=document.createElement('a');
link.href = filePath;
link.download = filePath.substr(filePath.lastIndexOf('/') + 1);
link.click();
}
В моем приложении я использую его следующим образом:
downloadFile('report/xls/myCustomReport.xlsx');
Рабочая Демо:
function downloadFile(filePath) {
var link = document.createElement('a');
link.href = filePath;
link.download = filePath.substr(filePath.lastIndexOf('/') + 1);
link.click();
}
downloadFile("http://www.adobe.com/content/dam/Adobe/en/accessibility/pdfs/accessing-pdf-sr.pdf");
Ответ 7
Если ссылка на действительный URL-адрес файла, просто назначьте window.location.href.
Однако иногда ссылка недействительна, и необходим iFrame.
Сделайте ваш обычный event.preventDefault, чтобы предотвратить открытие окна, и если вы используете jQuery, это будет работать:
$('<iframe>').attr('src', downloadThing.attr('href')).appendTo('body').on("load", function() {
$(this).remove();
});
Ответ 8
Изменение местоположения окна может вызвать некоторую проблему, особенно когда у вас есть постоянное соединение, такое как websocket. Поэтому я всегда прибегаю к хорошему старому решению iframe.
HTML
<input type="button" onclick="downloadButtonClicked()" value="Download"/>
...
...
...
<iframe style="display:none;" name="hiddenIframe" id="hiddenIframe"></iframe>
Javascript
function downloadButtonClicked() {
// Simulate a link click
var url = 'your_download_url_here';
var elem = document.createElement('a');
elem.href = url;
elem.target = 'hiddenIframe';
elem.click();
}
Ответ 9
Использование API-объекта HTML5 Blob Object-URL:
/**
* Save a text as file using HTML <a> temporary element and Blob
* @see https://stackoverflow.com/questions/49988202/macos-webview-download-a-html5-blob-file
* @param fileName String
* @param fileContents String JSON String
* @author Loreto Parisi
*/
var saveBlobAsFile = function(fileName,fileContents) {
if(typeof(Blob)!='undefined') { // using Blob
var textFileAsBlob = new Blob([fileContents], { type: 'text/plain' });
var downloadLink = document.createElement("a");
downloadLink.download = fileName;
if (window.webkitURL != null) {
downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
}
else {
downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
downloadLink.onclick = document.body.removeChild(event.target);
downloadLink.style.display = "none";
document.body.appendChild(downloadLink);
}
downloadLink.click();
} else {
var pp = document.createElement('a');
pp.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileContents));
pp.setAttribute('download', fileName);
pp.onclick = document.body.removeChild(event.target);
pp.click();
}
}//saveBlobAsFile
/**
* Save a text as file using HTML <a> temporary element and Blob
* @see https://stackoverflow.com/questions/49988202/macos-webview-download-a-html5-blob-file
* @param fileName String
* @param fileContents String JSON String
* @author Loreto Parisi
*/
var saveBlobAsFile = function(fileName, fileContents) {
if (typeof(Blob) != 'undefined') { // using Blob
var textFileAsBlob = new Blob([fileContents], {
type: 'text/plain'
});
var downloadLink = document.createElement("a");
downloadLink.download = fileName;
if (window.webkitURL != null) {
downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
} else {
downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
downloadLink.onclick = document.body.removeChild(event.target);
downloadLink.style.display = "none";
document.body.appendChild(downloadLink);
}
downloadLink.click();
} else {
var pp = document.createElement('a');
pp.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileContents));
pp.setAttribute('download', fileName);
pp.onclick = document.body.removeChild(event.target);
pp.click();
}
} //saveBlobAsFile
var jsonObject = {
"name": "John",
"age": 31,
"city": "New York"
};
var fileContents = JSON.stringify(jsonObject, null, 2);
var fileName = "data.json";
saveBlobAsFile(fileName, fileContents)
Ответ 10
Как насчет:
<meta http-equiv="refresh" content="5;url=http://site.com/file.ext">
Этот способ работает во всех браузерах (я думаю) и позволяю вам помещать сообщение типа: "Если загрузка не начинается через пять секунд, нажмите здесь".
Если вам нужно, чтобы он был с javascript.. ну...
document.write('<meta http-equiv="refresh" content="5;url=http://site.com/file.ext">');
Привет
Ответ 11
Маленький/скрытый iframe может работать для этой цели.
Таким образом, вам не нужно беспокоиться о закрытии всплывающего окна.
Ответ 12
После нескольких часов попыток эта функция родилась :) У меня был сценарий, когда мне приходилось отображать загрузчик во время подготовки файла к загрузке:
Работа в Chrome, Safari и Firefox
function ajaxDownload(url, filename = 'file', method = 'get', data = {}, callbackSuccess = () => {}, callbackFail = () => {}) {
$.ajax({
url: url,
method: 'GET',
xhrFields: {
responseType: 'blob'
},
success: function (data) {
// create link element
let a = document.createElement('a'),
url = window.URL.createObjectURL(data);
// initialize
a.href = url;
a.download = filename;
// append element to the body,
// a must, due to Firefox
document.body.appendChild(a);
// trigger download
a.click();
// delay a bit deletion of the element
setTimeout(function(){
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
}, 100);
// invoke callback if any
callbackSuccess(data);
},
error: function (err) {
// invoke fail callback if any
callbackFail(err)
}
});