2013-08-23 12 views
22

Z poniższego kodu tworzę dynamiczny znacznik zakotwiczenia, który pobiera plik. Ten kod działa dobrze w Chrome, ale nie w IE. Jak mogę dostać tę pracęPobierz atrybut w tagu A, który nie działa w IE

<div id="divContainer"> 
    <h3>Sample title</h3> 
</div> 
<button onclick="clicker()">Click me</button> 

<script type="text/javascript"> 

    function clicker() { 
     var anchorTag = document.createElement('a'); 
     anchorTag.href = "http://cdn1.dailymirror.lk/media/images/finance.jpg"; 
     anchorTag.download = "download"; 
     anchorTag.click(); 


     var element = document.getElementById('divContainer'); 
     element.appendChild(anchorTag); 
    } 

</script> 
+2

Dlaczego niepokoi Cię appendChild go, gdy klikniesz najpierw? Ad dlaczego kliknij, gdy możesz zrobić location = URL – mplungjan

+0

Nie widzę sensu w tworzeniu nowego tagu. Dlaczego nie uruchamiasz pobierania po kliknięciu przycisku "Kliknij mnie". Użytkownicy sieci nie lubią kliknąć –

+0

Dla odniesienia http://caniuse.com/#feat=download – Elangovan

Odpowiedz

19

Program Internet Explorer nie obsługuje obecnie atrybutów Download na znacznikach A.

Zobacz http://caniuse.com/download i http://status.modern.ie/adownloadattribute; ten ostatni wskazuje, że funkcja jest "pod uwagę" dla IE12.

+2

Więc nie ma obejścia, aby ustawić nazwę pliku w IE? – ps0604

+0

Twoje pytanie jest niewystarczająco precyzyjne. Serwer dostarczający pliki wybiera nazwę pliku. – EricLaw

1

Dołącz dziecko, a potem kliknij

Albo można użyć window.location = „url”;

+1

Jeśli najpierw dołączę dziecko, a następnie kliknę.Przekierowuje do obrazu, zamiast pobierać – Nipuna

+2

window.location = 'url'; nie działa w IE –

0

Jak wspomniano we wcześniejszej odpowiedzi, atrybut pobierania nie jest obsługiwany w IE. Jako obejście możesz użyć iFrame do pobrania pliku. Oto przykładowy fragment kodu.

function downloadFile(url){ 
    var oIframe = window.document.createElement('iframe'); 
    var $body = jQuery(document.body); 
    var $oIframe = jQuery(oIframe).attr({ 
     src: url, 
     style: 'display:none' 
    }); 
    $body.append($oIframe); 

} 
+0

Jak to ma działać? Mam element iframe dołączony tuż przed zamykającym znaczkiem '' ze źródłem mojego pliku. – Dusty

+0

Jeśli treść-disposoition w nagłówku jest załącznik, spróbuje pobrać zamiast renderowania w iFrame. – May13ank

+0

nagłówek ("Content-Disposition: attachment; filename =" some filename "'); – May13ank

5

Stare pytanie, ale myślałem, że dodać nasze rozwiązanie. Oto kod użyty w moim ostatnim projekcie. Nie jest doskonały, ale przeszedł kontrolę jakości we wszystkich przeglądarkach i IE9 +.

downloadCSV(data,fileName){ 
    var blob = new Blob([data], {type: "text/plain;charset=utf-8;"}); 
    var anchor = angular.element('<a/>'); 

    if (window.navigator.msSaveBlob) { // IE 
    window.navigator.msSaveOrOpenBlob(blob, fileName) 
    } else if (navigator.userAgent.search("Firefox") !== -1) { // Firefox 
    anchor.css({display: 'none'}); 
    angular.element(document.body).append(anchor); 

    anchor.attr({ 
     href: 'data:attachment/csv;charset=utf-8,' + encodeURIComponent(data), 
     target: '_blank', 
     download: fileName 
    })[0].click(); 

    anchor.remove(); 
    } else { // Chrome 
    anchor.attr({ 
     href: URL.createObjectURL(blob), 
     target: '_blank', 
     download: fileName 
    })[0].click(); 
    } 
} 

Używanie specyficznego dla MS interfejsu API działało najlepiej dla nas w IE. Zwróć też uwagę, że niektóre przeglądarki wymagają, aby kotwica faktycznie znajdowała się w DOM, aby atrybut atrybucji działał, podczas gdy Chrome na przykład nie. Ponadto znaleźliśmy kilka niespójności w działaniu Blobów w różnych przeglądarkach. Niektóre przeglądarki mają również limit eksportu. Pozwala to na największy możliwy eksport CSV w każdej przeglądarce afaik.

1

Ten fragment kodu pozwala na zapisywanie kropli w pliku w IE, Edge i innych nowoczesnych przeglądarkach.

var request = new XMLHttpRequest(); 
request.onreadystatechange = function() { 

    if (request.readyState === 4 && request.status === 200) { 

     // Extract filename form response using regex 
     var filename = ""; 
     var disposition = request.getResponseHeader('Content-Disposition'); 
     if (disposition && disposition.indexOf('attachment') !== -1) { 
      var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; 
      var matches = filenameRegex.exec(disposition); 
      if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, ''); 
     } 

     if (window.navigator.msSaveOrOpenBlob) { // for IE and Edge 
      window.navigator.msSaveBlob(request.response, filename); 
     } else { 
      // for modern browsers 
      var a = document.createElement('a'); 
      a.href = window.URL.createObjectURL(request.response); 
      a.download = filename; 
      a.style.display = 'none'; 
      document.body.appendChild(a); 
      a.click(); 
     } 
    } 

    button.disabled = false; 
    dragArea.removeAttribute('spinner-visible'); 
    // spinner.style.display = "none"; 

}; 
request.open("POST", "download"); 
request.responseType = 'blob'; 
request.send(formData); 

Dla IE i EDGE użytku: msSaveBlob

6

w moim przypadku, ponieważ nie jest to wymóg, aby wspierać korzystanie z IE 11 (wersja 11.0.9600.18665), skończyło się za pomocą rozwiązania dostarczonego przez @Henners na jego komentarz:

// IE10+ : (has Blob, but not a[download] or URL) 
if (navigator.msSaveBlob) { 
    return navigator.msSaveBlob(blob, fileName); 
} 

Jest to bardzo proste i praktyczne.

Najwyraźniej to rozwiązanie zostało znalezione w funkcji Javascript download utworzonej przez dandavis.

+0

Próbowałem tego i otrzymuję blob jest niezdefiniowany. Czy możesz wyjaśnić, jak zdefiniować blob i co w nim umieścić. Mam tylko adres URL pliku. Czy istnieje sposób na załadowanie pliku do obiektu typu blob z adresu URL? – boilers222

+0

Być może [ta odpowiedź] (https://stackoverflow.com/questions/34000412/how-do-i-concon-url-to-blob-with-javascript-or-jquery) może pomóc w osiągnięciu pożądanej konwersji . Następnie wystarczy uruchomić pobieranie, o którym mowa w mojej odpowiedzi. – aribeiro