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

Geu*_*uis 26 javascript html5

对于不支持HTML5"下载"属性的浏览器,是否有客户端备用选项?

目前,只有Chrome才能正确支持此功能.Firefox有支持,但从一个迟钝的观点来看,它应该只针对"安全"问题来自同一域的文件.

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

Firefox的"安全影院"也不是很有用,因为它是设置代理的任意机制.

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

rvi*_*hne 14

简短的回答:没有.除了download您已经提到的属性之外,没有干净的客户端方法来执行此操作.发送正确的头文件是最好的,但也有,你可能不希望使用黑客:

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

我告诉过你,你不喜欢它!


小智 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);
      }
    }
  }
);
Run Code Online (Sandbox Code Playgroud)