html5 下载属性的任何后备客户端解决方案?

Posted

技术标签:

【中文标题】html5 下载属性的任何后备客户端解决方案?【英文标题】:Any fallback client-side solutions for the html5 download attribute? 【发布时间】:2013-09-10 06:10:33 【问题描述】:

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

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

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

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

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

【问题讨论】:

好吧,规范说This algorithm is intended to mitigate security dangers involved in downloading files from untrusted sites, and user agents are strongly urged to follow it.,所以我怀疑任何浏览器供应商都会允许下载属性指向另一个来源(域)。 【参考方案1】:

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

对于所有带有download 属性的链接(您可以获取带有document.querySelectorAll('a[download]') 的链接),使用XMLHttpRequest 来获取HREF 中提到的URL 处的页面/数据。然后,使用btoa() 函数(或 IE 的 polyfill)将其转换为 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 = /*@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);
      
    
  
);

【讨论】:

效果很好!我在这里注意到的一件事是,如果我在打开之前设置 responseType,IE 会抛出无效状态错误...

以上是关于html5 下载属性的任何后备客户端解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 本地存储后备解决方案 [关闭]

使用 mediaelement.js 与 HTML5 后备的 Flash 视频

html5 音频播放器 flash 后备

HTML5 多人游戏安全解决方案

HTML5 视频的图像占位符后备

即使浏览器支持 html5 视频,也显示后备图像