27

对于不支持 HTML5“下载”属性的浏览器,是否有客户端回退选项?

目前,这仅在 Chrome 中得到适当支持。Firefox 有支持,但采取了一种迟钝的观点,即它应该只处理来自同一域的文件以解决“安全”问题。

处理这个问题的正确方法是使用一个后端服务器来代理带有 Content-Disposition 标头的请求文件,但在这种情况下,它很可能不是一个选项。

Firefox 的“安全剧院”也不是很有帮助,因为它是设置代理的任意机制。

我正在查看https://github.com/dcneiner/Downloadify但刚刚意识到它只支持文件创建,不支持远程文件访问。

4

2 回答 2

14

简短的回答:不。除了download您已经提到的属性之外,没有干净的客户端方法可以做到这一点。最好发送正确的标头,但有一个您可能不想使用的 hack:

对于具有该download属性的所有链接(您可以使用 获取那些链接document.querySelectorAll('a[download]')),使用XMLHttpRequest获取 HREF 中提到的 URL 处的页面/数据。然后,使用该btoa()函数(或 IE 的 polyfill)将其转换为 base64 字符串。现在添加"data:application/octet-stream;base64,"到字符串的开头并将其设置为锚的新 HREF 属性,然后删除该download属性。(您可能希望首先使用Modernizr 之类的东西来探索浏览器支持)。

我告诉过你你不会喜欢的!

于 2013-12-03T02:49:17.590 回答
11

我写了这个 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 = /*@cc_on!@*/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);
      }
    }
  }
);
于 2015-06-30T15:51:00.443 回答