对于不支持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)