Javascript html5下载属性有任何回退客户端解决方案吗?

Javascript html5下载属性有任何回退客户端解决方案吗?,javascript,html,Javascript,Html,对于不支持HTML5“下载”属性的浏览器,是否有客户端回退选项 目前,这仅在Chrome中得到正确支持。Firefox提供了支持,但却采取了一种迟钝的观点,认为它应该只在同一个域中的文件上工作,以解决“安全”问题 处理此问题的正确方法是使用后端服务器,该服务器使用内容处置头代理请求的文件,但在这种情况下,它很可能不是一个选项 Firefox的“安全剧场”也不是很有用,因为它是一种任意设置代理的机制 我正在查看,但刚刚意识到它只支持文件创建,不支持远程文件访问。简短的回答是:不支持。除了您已经提到

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

目前,这仅在Chrome中得到正确支持。Firefox提供了支持,但却采取了一种迟钝的观点,认为它应该只在同一个域中的文件上工作,以解决“安全”问题

处理此问题的正确方法是使用后端服务器,该服务器使用内容处置头代理请求的文件,但在这种情况下,它很可能不是一个选项

Firefox的“安全剧场”也不是很有用,因为它是一种任意设置代理的机制


我正在查看,但刚刚意识到它只支持文件创建,不支持远程文件访问。

简短的回答是:不支持。除了您已经提到的
下载属性之外,没有干净的客户端方法来实现这一点。发送正确的标题是最好的,但是有一个你可能不想使用的技巧:

对于具有
下载
属性的所有链接(您可以使用
document.queryselectoral('a[download]'))
),使用获取HREF中提到的URL处的页面/数据。然后,使用函数(或IEs的polyfill)将其转换为base64字符串。现在在字符串的开头添加
“data:application/octet stream;base64”
,并将其设置为锚的新HREF属性,然后删除
下载属性。(您可能希望首先使用类似的方法来探测浏览器支持)


我告诉过你你不会喜欢的

我写了这个JS[attrldownloadie.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);
      }
    }
  }
);
//作者:卡洛斯·马查多
//版本:0.1
//年份:2015年
//
var f_name=“”;
var f_ref=“”;
函数reqListener(){
如果(f_name==“”){f_name=f_ref;}
var blobObject=this.response;
window.navigator.msSaveBlob(blobObject,f_name);
}
函数myDownload(evt){
f_name=this.getAttribute(“下载”);
f_ref=this.getAttribute(“href”);
evt.preventDefault();
var oReq1=新的XMLHttpRequest();
oReq1.addEventListener(“加载”,reqListener,false);
oReq1.open(“get”,this,true);
oReq1.responseType='blob';
oReq1.send();
}
document.addEventListener(
“加载”,
功能(事件){
var isIE=/*@cc_on!@*/false | |!!document.documentMode;
如果(isIE){
var items=document.querySelectorAll('a[download],area[download]');
对于(变量i=0;i
好吧,规范上说,所以我怀疑任何浏览器供应商是否会允许下载属性指向另一个来源(域)。效果很好!我注意到的一点是,如果我在打开之前设置responseType,即抛出无效状态错误。。。