Найпростіший спосіб відкрити вікно завантаження, не відходячи від сторінки


118

Який найкращий спосіб перехресного браузера відкрити діалогове вікно завантаження (припустимо, ми можемо встановити вміст-диспозіція: вкладення у заголовки), не відходячи від поточної сторінки або відкриваючи спливаючі вікна, що не працює добре в Internet Explorer (IE ) 6.

Відповіді:


106

Минуло 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);

Спочатку дякую за це рішення, але я знайшов помилку, якщо deleteChild (a) блискавка розпакує помилку, коли пошкоджено zip, тому видаліть цей код, вирішіть його
Roy

2
@Manoj Rana - я перевірив на FF 58.0.2 (64-бітний), що він працює. Він не працюватиме на будь-якому FF, якщо ви видалите 2 рядки document.body.appendChild (a); document.body.removeChild (a);
0x000f

1
Щоб він працював на Edge 16, заголовок, звідки надходить файл, повинен містити Content-Type: application/octet-streamі Content-Disposition: attachment.
Саймон


2
@ user1933131 хром видаляє лише для перехресного походження
Brandy23

201

Цей javascript хороший тим, що він не відкриває нове вікно чи вкладку.

window.location.assign(url);

17
Це те саме, що window.location = url; "Кожного разу, коли новому значенню присвоюється об'єкт розташування, документ завантажуватиметься за допомогою URL-адреси, як якщо б виклик window.location.assign () був змінений URL-адресою" - developer.mozilla.org/en-US/docs/ Web / API / window.location
Rob Juurlink

13
Це призводить до відключення з’єднання WebSocket.
ігорпавлов

4
Я використовував те саме рішення, але він відкриває файл на тій самій вкладці замість відкриття діалогового вікна завантаження.
Techno Cracker

2
це те ж саме для window.open (URL, '_self'), якщо URL-адреса для завантаження.
Експерт хоче бути

5
Під час використання IE11 я виявив, що це спричинило зупинку JS. Тож для IE 11 я використав window.open (URL, '_blank'), який відкрив ще одну вкладку, однак ця вкладка закрилася, коли вона працювала, файл був завантаженням. Це продовжувало працювати JS.
Лука

23

Я завжди додаю target = "_ blank" до посилання для завантаження. Це відкриє нове вікно, але як тільки користувач натисне кнопку "Зберегти", нове вікно закриється.


2
Це найкраща відповідь. В Internet Explorer, додавання 'target = "_ blank"' до посилання, яке потрібно завантажити, зупинить перегляд браузера (там, де надруковано "HTML1300: Навигація"), і таким чином можна залишити сторінку в непослідовному стані.
user64141

23

Помістіть це у розділі HTML, встановивши urlvar до 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> 

( Звідси .)


2
це не працює, тому що в IE6, якщо користувач натискає "зберегти", файл зберігається, але спливаюче вікно залишається відкритим. Це не прийнятно.
mkoryak

цей код не працює в сафарі, чи можете ви допомогти мені вирішити сафарі, будь ласка.
Реніш Кхунт

17

Я знаю, що питання було задано, 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');

Робоча демонстрація:

Примітка:

  • Ви повинні використовувати link.download атрибут, щоб браузер не відкривав файл на новій вкладці та запускав спливаюче вікно завантаження.
  • Це було перевірено декількома типами файлів (docx, xlsx, png, pdf, ...).

Який найкращий спосіб відобразити gif-файл для завантаження, поки файл не завантажиться?
Ctrl_Alt_Defeat

1
@Ctrl_Alt_Defeat Добре в цьому випадку відстежувати процес завантаження буде непросто, але одним фокусом може бути показ цієї gif-анімації при linkнатисканні та приховання після закінчення тайм-ауту, використовуючи цей код: link.onclick = function() { document.body.innerText = "The file is being downloaded ..."; setTimeout(function() { document.body.innerText = ""; }, 2000); }ви можете побачити, як вона працює в цьому загадка , але майте на увазі, що це не рекомендований спосіб зробити це, було б краще впоратися з нами Ajax.
cnŝdk

1
це не працює у firefox. як завантажити у firefox?
Маной Рана

@ManojRana Для світлячок, ви можете використовувати iframeпобачити цю відповідь .
cnŝdk

2
Це рішення працює для Chrome, Safari та Firefox для мене :)
ariebear

15

Я шукав хороший спосіб використовувати 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; 
}

те саме, що .visuallyHidden in 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

Використання API файлу HTML5 Blob Object-URL:

/**
 * Save a text as file using HTML <a> temporary element and Blob
 * @see /programming/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 /programming/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)


2
Я відчуваю, що це найкращий спосіб зробити це !!
Кушаль М.К.

1
Це також хороша практика зателефонувати URL.revokeObjectURL(url), коли файл більше не потрібен для звільнення пам'яті
SleepWalker

5

Змінення місця розташування вікна може спричинити певну проблему, особливо коли у вас є стійке з'єднання, наприклад, веб-розетка. Тому я завжди вдаюся до старого хорошого рішення 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();
}

5

Якщо посилання на дійсну URL-адресу файлу, просто призначить window.location.href буде працювати.

Однак іноді посилання недійсне, і iFrame потрібен.

Зробіть свій звичайний event.preventDefault, щоб запобігти відкриттю вікна, і якщо ви використовуєте jQuery, це спрацює:

$('<iframe>').attr('src', downloadThing.attr('href')).appendTo('body').on("load", function() {
   $(this).remove();
});

2

Після години спроб функція народжується :) У мене був сценарій, коли мені довелося відображати завантажувач вчасно, поки файл готується до завантаження:

Працює в 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)
        }
    });

0

Як щодо:

<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">');

З повагою


0

Для цього може працювати невеликий / прихований кадр.

Таким чином, вам не доведеться турбуватися про закриття спливаючого вікна.

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