//下载文件流函数,只支持get方法。
export function downBlob(payload) {
return new Promise(((resolve, reject) => {
// 获取时间戳
let timestamp=new Date().getTime();
// 获取XMLHttpRequest
let xmlResquest = new XMLHttpRequest();
// 发起请求
xmlResquest.open("GET", payload.url +"?"+ (payload.param), true);
// 设置请求头类型
xmlResquest.setRequestHeader("Content-type", "application/json");
//返回类型为文件流
xmlResquest.responseType = "blob";
// 返回
xmlResquest.onload = function(oEvent) {
let content = xmlResquest.response;
//请求失败
if(xmlResquest.status === 404){
message.error("文件不存在,请稍后再试");
return;
}
//请求失败
if(xmlResquest.status != 200){
message.error("网络错误,请稍后再试");
return;
}
//
let reader = new FileReader();
reader.onload = function(event){
//json成功表示服务器报错,将错误信息提示出来
try {
let result = JSON.parse(reader.result);
message.error(result.errorMsg)
reject(result);
}catch (e) {
//json化失败,表示是一个文件流,将文件流下载下来
// 组装a标签
 

p.p1 { margin: 0; font: 13px "Helvetica Neue"; color: rgba(0, 0, 0, 1) }

if('msSaveOrOpenBlob' in navigator){

window.navigator.msSaveOrOpenBlob(blob, fileName);

return;

}

let elink = document.createElement("a");
// 设置下载文件名
elink.download = payload.fileName || timestamp + ".xlsx";
elink.style.display = "none";
let blob = new Blob([content]);
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
document.body.removeChild(elink);
resolve();
}
};
reader.readAsText(content);
};
xmlResquest.send();
}));
}
 
 
或者

//文件地址
var url = '../aaa/bbb/模板.xlsx';
var xhr = new XMLHttpRequest();
xhr.open('get', url, true);
xhr.responseType = "blob"; // 返回类型blob
// 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
xhr.onload = function() {
// 请求完成
if(this.status === 200) {
// 返回200
var blob = this.response;
var href = window.URL.createObjectURL(blob); //创建下载的链接
//判断是否是IE浏览器,是的话返回true
if (window.navigator.msSaveBlob) {
try {
window.navigator.msSaveBlob(blob, '模板.xlsx')
} catch (e) {
console.log(e);
}
} else {
// 谷歌浏览器 创建a标签 添加download属性下载
var downloadElement = document.createElement('a');
downloadElement.href = href;
downloadElement.target = '_blank';
downloadElement.download = '模板.xlsx'; //下载后文件名
document.body.appendChild(downloadElement);
downloadElement.click(); //点击下载
document.body.removeChild(downloadElement); //下载完成移除元素
window.URL.revokeObjectURL(href); //释放掉blob对象
}
}
}
// 发送ajax请求
xhr.send()
 
 
 
-------------------------------------------------------

代码:

var wb;//读取完成的数据
function importf(obj) {//导入
//判断FileReader是否存在,FileReader是实现纯前端导入的必要方法
if (typeof (FileReader) != "undefined") {
//判断是否可以使用readAsBinaryString,IE10浏览器没有的情况下用readAsArrayBuffer,手动将文件流转二进制字符串(fixdata方法在下方)
if (!FileReader.prototype.readAsBinaryString) {
var f = obj.files[0];
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
wb = XLSX.read(btoa(fixdata(data)), {
type: 'base64'
});
//此处showImportVehicles是我接下来展示数据的方法,红色部分可拿到Excel中第一列的具体数值,其他列自然也可以容易获取
window.parent.page
.showImportVehicles(JSON.stringify(XLSX.utils
.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])));
};
reader.readAsArrayBuffer(f);
} else {
//不需要兼容IE10及以下版本浏览器时可用readAsBinaryString
var f = obj.files[0];
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
wb = XLSX.read(data, {
type: 'binary'
});
window.parent.page.showImportVehicles(JSON.stringify(XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])));
};
reader.readAsBinaryString(f);
}
} else {
//IE9及以下版本浏览器,没有FileReader方法时,无法实现纯前端导入Excel,这时在后端获取文件内容再返回前端,更加方便快捷
$.ajaxFileUpload
({
url: "/etims-track/track/importVehicles",
secureuri: false,
fileElementId: 'excelFile',
timeout: 600000,
success: function (data) {
var str = data.body.innerHTML;//获取返回的字符串
window.parent.page.showImportVehicles(str);
},
error: function (data, status, e) {
}
})
}

}

function fixdata(data) { //文件流转BinaryString
var o = "";
var bytes = new Uint8Array(data);
for (var i = 0; i < data.byteLength; i++) {
o += String.fromCharCode(bytes[i]);
}
return o;
}

注:兼容IE9及以下版本使用ajaxFileUpload向后端传文件的兼容处理:

在ajaxfileupload.js文件中有这样一段代码:
if(window.ActiveXObject) {
if(jQuery.browser.version=="9.0" || jQuery.browser.version=="10.0"){
var io = document.createElement('iframe');
io.id = frameId;
io.name = frameId;
}else if(jQuery.browser.version=="6.0" || jQuery.browser.version=="7.0" || jQuery.browser.version=="8.0"){
var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
if(typeof uri== 'boolean'){
io.src = 'javascript:false';
}
else if(typeof uri== 'string'){
io.src = uri;
}
}
}
这段代码已经是在想办法去兼容浏览器版本了,但在IE9版本浏览器下,无法识别JQuery.browser.version,也就是无法识别浏览器版本version,因此修改成以下代码:

if(window.ActiveXObject) {
var ieVersion = navigator.appVersion.split(";")[1].replace(/[ ]/g, "").replace("MSIE","");
if(ieVersion=="9.0" || ieVersion=="10.0"){
var io = document.createElement('iframe');
io.id = frameId;
io.name = frameId;
}else if(ieVersion=="6.0" || ieVersion=="7.0" || ieVersion=="8.0"){
var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
if(typeof uri== 'boolean'){
io.src = 'javascript:false';
}
else if(typeof uri== 'string'){
io.src = uri;
}
}
}
这里的ieVersion获取到的就是IE浏览器的版本,就可以解决兼容性问题。

另:在通过后端获取Excel文件中内容时,除了通过ajaxFileUpload方式,也可以使用Jquery form表单提交的形式。

IE浏览器a标签无法下载问题解决(IE浏览器a标签download属性不兼容问题解决)的更多相关文章

  1. 判断浏览器是否支持某些新属性---placeholder兼容问题解决

    function is_true(){ return 'placeholder' in document.createElement('input'); } 实例:placeholder在低版本IE浏 ...

  2. JS前端下载文本文件小技巧:1、download属性;2、借助Blob转换成二进制下载

    一.HTML download 与文件下载 如果希望在前端侧直接触发某些资源的下载,最方便快捷的方法就是使用HTML5原生的download属性,例如: <a href="large. ...

  3. 使用a标签直接下载图片

    通常情况下,使用a标签链接到图片,会在浏览器中打开这个图片,而不会下载 如果要直接下载这个图片,可以使用download属性配合href属性 <a href="./1.jpg" ...

  4. Folx使用教程:怎么通过设置标签分类下载内容

    很多Mac OS下载软件从网上下载各种各样的文件,一般默认都会存放在"下载"文件夹中.如果不是经常整理"下载"文件夹,久而久之,该文件夹会变得庞大而杂乱. 如果 ...

  5. 下载apk文件浏览器会直接打开并显示乱码的问题

    今天同事反映他的apk文件在自己的老项目中下载有问题:下载apk文件浏览器会直接打开并显示乱码,在别的项目中就没有问题. 后分析response的content-type发现,老项目的类型是text/ ...

  6. Google Chrome浏览器各版本直接下载地址

    Google Chrome浏览器各版本直接下载地址  2012.04.12珍藏软件  10161 Views  0 Comments 现在所用的主浏览器Google Chrome,在其官方主页上默认只 ...

  7. 在html使用a标签 直接下载图片 不通过后台实现直接下载

    由于a标签在HTML中链接图片会被识别并打开到网页上 如果想下载这个图片的话 就需要连接到后台读取文件并生成一个头信息下载.不过可以先给a标签加上一个download属性即可直接下载了. <a ...

  8. Python 配置 selenium 模拟浏览器环境,带下载链接

    使用浏览器渲染引擎.直接用浏览器在显示网页时解析HTML,应用CSS样式并执行JavaScript的语句. 这方法在爬虫过程中会打开一个浏览器,加载该网页,自动操作浏览器浏览各个网页,顺便把数据抓下来 ...

  9. 网页手机wap2.0网页的head里加入下面这条元标签,在iPhone的浏览器中页面将以原始大小显示,并不允许缩放

    网页手机wap2.0网页的head里加入下面这条元标签,在iPhone的浏览器中页面将以原始大小显示,并不允许缩放. <meta name="viewport" conten ...

  10. Nginx 配置下载附件让浏览器提示用户是否保存

    Nginx配置下载附件让浏览器提示用户是否保存   by:授客  QQ:1033553122   测试环境 nginx-1.10.0 问题描述: 前端页面,IE11浏览器下请求下载附件模板,针对xls ...

随机推荐

  1. speedtest测速

    wget https://raw.github.com/sivel/speedtest-cli/master/speedtest.py chmod a+rx speedtest.py mv speed ...

  2. 关于JWT中RSA数据加密协议在.net中应用

    加密协议有哪些 加密协议分为对称加密和非对称加密. 对称加密就是将信息使用一个密钥进行加密,解密时使用同样的密钥,同样的算法进行解密. 非对称加密,又称公开密钥加密,是加密和解密使用不同密钥的算法,广 ...

  3. js 判断滚动条 是否滚动到底部

    解决问题思路 滚动条距离上面的滚动高度(scrollTop) + 滚动条本身高度 = 整个页面的高度(pageHeight) 关键点:滚动条本身高度是多少 事实上,这里就有一个思想误区,人会想直接获取 ...

  4. LoadRunner参数和变量之间的转换

    这是用LoadRunner自定义监控Tomcat的脚本为基础而写的脚本.阐述了参数相互之间以及参数与变量之间复制传递原理.下面的代码注释是按照自己的理解写的,正确性不一定保证. Action() { ...

  5. Python学习笔记(四)算术运算符

    一.算术运算符 运算符 说明 实例 结果 + 加 12.45 + 15 27.45 - 减 4.56 - 0.26 4.3 * 乘 5 * 3.6 18.0 / 除法(和数学中的规则一样) 7 / 2 ...

  6. vue2源码学习2vuex&vue-router

    1.vue插件编写 插件可以实现对象vue的拓展,比如新增全局属性/方法,添加实例方法,使用mixin混入其他配置项等等.编写插件必须要实现 install 方法,当调用Vue.use()使用插件时, ...

  7. win10系统解决启动虚拟机蓝屏问题

    1.查看电脑是否开启了虚拟化,如果没起开开启 CTR+SHIFT+Esc 2.是否开启了虚拟化选项 win+r 输入 OptionalFeatures

  8. CAD梦想画图中的“绘图工具——多线段”

    CAD软件多线段命令是作为单个平面对象创建的相互连接的线段序列.可以创建直线段.圆弧段或两者的组合线段. 执行方式: (1)单击菜单栏"绘图→多线段".如图: (2)单击绘图工具栏 ...

  9. Razor视图cshtml做到运行时编译【提高开发效率】

    当你的.NET开发工具升级到.NET Core版本以上,就会发现有时候无法将视图界面做的修改可以直接保存后刷新输出,一般都需要重新热重载或重新编译,这样会导致开发效率过慢的行为,开发者无法直接直观地看 ...

  10. 【情景题】NPDP经典题目(下)

    1.员工Mary是ACE电气公司的产品经理,公司高管要求她准备一份评价标准清单,从而以该清单为基础来对该产品组合中的新机会进行评价.她提交的清单如下:-潜在市场份额-对公司获利能力的潜在贡献-产品开发 ...