2013-09-06 12 views
23

Czy istnieje opcja zastępcza po stronie klienta dla przeglądarek, które nie obsługują atrybutu "pobieranie" HTML5?Jakieś awaryjne rozwiązania po stronie klienta dla atrybutu pobierania html5?

Obecnie jest to poprawnie obsługiwane tylko w przeglądarce Chrome. Firefox ma wsparcie, ale ma podejrzany punkt widzenia, że ​​powinien działać tylko na plikach z tej samej domeny dla "problemów bezpieczeństwa".

Właściwym sposobem radzenia sobie z tym problemem jest posiadanie serwera zaplecza, który proksyfikuje żądane pliki z nagłówkiem Content-Disposition, ale w tym przypadku najprawdopodobniej nie jest to opcja.

"Teatr bezpieczeństwa" Firefoksa również nie jest zbyt przydatny, ponieważ jest to arbitralny mechanizm konfiguracji proxy.

Patrzyłem na https://github.com/dcneiner/Downloadify, ale po prostu zdałem sobie sprawę, że obsługuje tylko tworzenie plików, a nie zdalny dostęp do plików.

+6

dobrze, specyfikacja mówi [Algorytm ten ma na celu łagodzenie zagrożeń bezpieczeństwa związanych z pobieraniem plików z niezaufanych witryn i oprogramowanie użytkownika Usilnie zaleca się go śledzić .] (http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#downloading-resources), więc wątpię, aby każdy dostawca przeglądarki zezwalał atrybutowi pobierania na wskazywanie innego pochodzenie (domena). – Lachezar

Odpowiedz

12

Krótka odpowiedź: nie. Oprócz wspomnianego już atrybutu download, nie ma metody czystej po stronie klienta, aby to zrobić. Wysyłanie prawidłowego nagłówka byłoby najlepsze, ale nie jest hack, że prawdopodobnie nie chcesz używać:

Dla wszystkich linków z atrybutem download (można dostać te z document.querySelectorAll('a[download]')), użyj XMLHttpRequest aby uzyskać strona/dane pod adresem URL wymienionym w HREF. Następnie użyj funkcji btoa() (lub polyfill dla IE), aby przekonwertować ją na ciąg base64. Teraz dodaj "data:application/octet-stream;base64," na początku łańcucha i ustaw jako nowy atrybut zakotwiczenia HREF, a następnie usuń atrybut download. (Najprawdopodobniej najpierw będziesz sprawdzał obsługę przeglądarki, z czymś takim, jak Modernizr).

Powiedziałem ci, że ci się nie spodoba!

10

pisałem ten js [attrDownloadIE.js]

// author: Carlos Machado 
// version: 0.1 
// year: 2015 
// 
var f_name = ""; 
var f_ref = ""; 

function reqListener() { 
    if(f_name == "") {f_name = f_ref;} 
    var blobObject = this.response; 
    window.navigator.msSaveBlob(blobObject, f_name); 
} 

function myDownload(evt) { 
    f_name = this.getAttribute("download"); 
    f_ref = this.getAttribute("href"); 
    evt.preventDefault(); 
    var oReq1 = new XMLHttpRequest(); 
    oReq1.addEventListener("load",reqListener, false); 
    oReq1.open("get", this, true); 
    oReq1.responseType = 'blob'; 
    oReq1.send(); 
} 

document.addEventListener(
    "load", 
    function(event){ 
    var isIE = /*@[email protected]*/false || !!document.documentMode; 
    if(isIE) { 
     var items = document.querySelectorAll('a[download], area[download]'); 
     for(var i = 0; i < items.length; i++) { 
     items[i].addEventListener('click', myDownload, false); 
     } 
    } 
    } 
); 
+0

Działa świetnie! Jedna rzecz, którą zauważyłem tutaj, to: Jeśli ustawię ResponseType przed otwarciem, IE wyrzuca nieprawidłowy błąd stanu ... –

Powiązane problemy