Подтвердить что ты не робот

Любые резервные клиентские решения для атрибута загрузки html5?

Есть ли резервная опция на стороне клиента для браузеров, которые не поддерживают атрибут "загрузить" HTML5?

В настоящее время это поддерживается только в Chrome. У Firefox есть поддержка, но он принял тупое мнение, что он должен работать только с файлами из одного домена для проблем безопасности.

Правильный способ справиться с этим - иметь серверный сервер, который проксирует запрашиваемые файлы с заголовком Content-Disposition, но в этом случае его скорее всего не вариант.

"Театр безопасности Firefox" не очень полезен, поскольку это произвольный механизм для настройки прокси.

Я смотрел https://github.com/dcneiner/Downloadify, но просто понял, что он поддерживает только создание файлов, а не удаленный доступ к файлам.

4b9b3361

Ответ 1

Короткий ответ: нет. Помимо атрибута download, о котором вы уже упоминали, для этого не существует чистого клиентского метода. Лучше всего будет отправлять правильный заголовок, но есть хак, который вы, вероятно, не хотите использовать:

Для всех ссылок с атрибутом download (вы можете получить их с помощью document.querySelectorAll('a[download]')), используйте XMLHttpRequest, чтобы получить страницу/данных по URL-адресу, указанному в HREF. Затем используйте функцию btoa() (или polyfill для IE), чтобы преобразовать ее в строку base64. Теперь добавьте "data:application/octet-stream;base64," в начало строки и установите это как новый атрибут HREF привязки, затем удалите атрибут download. (Вероятно, вы сначала захотите проверить поддержку браузера, с чем-то вроде Modernizr).

Я сказал вам, что вам это не понравится!

Ответ 2

Я написал этот 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);
      }
    }
  }
);