文件下载分为两种形式

  1. 如果后台服务器的静态目录有可供下载的静态资源,则通过【window.location.href=“文件路径”】方式获取即可;

  2. 如果后台服务器无可供下载的静态资源,返回的是一个文件流,则通过将文件写入内存,并且创建a元素,a链接href属性指向内存中的文件,download属性指向要下载的文件名,模拟a元素的点击事件,进行下载;

具体使用哪种方式下载文件,取决于后台。下面举例讲第二种方式

文件下载前后端接口如下:

一、下载文件

IE11文件下载:【window.navigator.msSaveBlob(res.data, 文件名);】或【window.navigator.msSaveOrOpenBlob(res.data, 文件名);

chrome等其他浏览器:通过将文件写入内存,并且创建a元素,a链接href属性指向内存中的文件,download属性指向要下载的文件名,模拟a元素的点击事件,进行下载;

二、处理下载失败

由于设置了【 responseType: "blob"】,会把后台返回的data强制转换为blob,那么,在创建下载文件链接前,先通过如下方式将已转为blob类型的data转回json格式,判断是否下载成功。

图中this.result为FileReader获取blob数据转换为json后的数据,即后台返回的原始数据。如果解析对象成功,进入【try{...}】处理后台返回下载失败的情况。如果解析成对象失败,说明是正常的文件流,进入【catch(err){...}】创建下载文件链接。

三、解决中文乱码,兼容IE11文件下载

【encodeURI(url)】可解决url中含有中文,在ie11浏览器下载失败问题。当在接口url处不加【encodeURI】时,chrome和IE11浏览器下载文件请求时控制台显示如下:

当在接口url处加上【encodeURI】时,IE11下载文件成功

完整代码如下:

【http.js】

​// 导入axios
import axios from "axios";// 设置基地址-使用自定义配置新建一个 axios 实例const http = axios.create({baseURL: "/",
});export const fileDownload = param => {return http.get(encodeURI(`system/file/download?filename=${param.fileName}`),{responseType: "blob"})

【点击下载文件按钮执行downloadHelp()方法】

   downloadHelp() {// 判断是否有下载权限if (this.permList.indexOf("/system/file/download") == -1) {this.$message.warning("抱歉,您没有操作权限!");} else {let param = {fileName: "产品使用手册V1.0 .docx",};fileDownload(param).then((res) => {let data = res.data;//处理下载失败情况,由于:responseType: 'blob'会把data强制转为blob,// 解决:将已转为blob类型的data转回json格式,判断是否下载成功let filereader = new FileReader();filereader.onload = function () {try {let jsonData = JSON.parse(this.result); // this.result为FileReader获取blob数据转换为json后的数据,即后台返回的原始数据alert(jsonData.respDesc);// if (!!jsonData["respCode"]) {//   this.$message.error(jsonData.respDesc);// }} catch (err) {//解析成对象失败,说明是正常的文件流if (window.navigator.msSaveOrOpenBlob) {// 兼容ie11try {// window.navigator.msSaveBlob(res.data, param.fileName); //response为接口返回数据,这里请求的时候已经处理了,如果没处理需要在此之前自行处理var data = new Blob([response.data]) 注意这里需要是数组形式的,fileNm就是下载之后的文件名window.navigator.msSaveOrOpenBlob(res.data, param.fileName);} catch (e) {console.log(e);}} else {//chrome浏览器let streamData = res.data;// 创建blob对象,传入后端返回的文件流let blob = new Blob([streamData], {type: "application/octet-stream;charset=utf-8",});let downloadUrl = window.URL.createObjectURL(blob); //创建下载的链接let alink = document.createElement("a");alink.href = downloadUrl;alink.download = param.fileName; //下载的文件名alink.click(); //点击下载window.URL.revokeObjectURL(downloadUrl); //释放blob对象}}};filereader.readAsText(data); // FileReader的API}).catch((error) => {console.log(error);});}},

JavaScript---文件下载处理文件下载失败兼容IE11文件下载相关推荐

  1. JavaScript 导入 excel文件(兼容IE11) 示例 打包下载

    IE下效果图: 主要是在网上找了一套插件,进行修改,调整了IE的兼容问题: 但是只在IE11 下可以.IE10和 以前的版本依旧不兼容: 下载地址: https://download.csdn.net ...

  2. ie input兼容 vue_vue+iview 兼容IE11浏览器的实现方法

    最近在搞一个基于vue的后台管理系统兼容IE浏览器,眼泪都要掉下来.后来和产品说了,同意兼容IE11,感动得我眼泪啊 这里也就是记录一下我遇到的超级烦的bug 首先是'babel-polyfill' ...

  3. vue+iview 兼容IE11浏览器

    最近在搞一个基于vue的后台管理系统兼容IE浏览器,眼泪都要掉下来.后来和产品说了,同意兼容IE11,感动得我眼泪啊 这里也就是记录一下我遇到的超级烦的bug 首先是'babel-polyfill' ...

  4. html 兼容ie11,前端开发中在IE11下出现的一些兼容性问题(持续汇总)

    1.Chrome上能够正常打开网页,可是在IE11上打开一片空白,打开控制台报语法错误,以下图: 点击chunk-vendors.js后发现是vue-baidu-map组件报错,以下图: 缘由: vu ...

  5. 分针网——Javascript不同浏览器差异及兼容方法

    Javascript不同浏览器差异及兼容方法 javascript的各种兼容就是为了解决不同浏览器的差异性,了解其中的差异能够帮助你更快的解决问题,提高代码的使用质量,编写更优秀的javascript ...

  6. 记一次 解决 vue 兼容ie11 的问题

    记一次 解决 vue 兼容ie11 的问题 参考文章: (1)记一次 解决 vue 兼容ie11 的问题 (2)https://www.cnblogs.com/qq735675958/p/117757 ...

  7. vue2打包兼容ie11白屏报错问题汇总

    vue2打包兼容ie11问题汇总 下载 babel-polyfill npm install --save-dev babel-polyfill main.js中引入 import "bab ...

  8. VUE项目兼容IE11 遇见的问题 SyntaxError: strict 模式下不允许一个属性有多个定义;ie11下载excel文件需要用navigator.msSaveBlob

    最近要把vue项目兼容ie11 前面引入bable等一系列操作就不说了,下面说一下具体具体的问题 1  如图所示  SyntaxError: strict 模式下不允许一个属性有多个定义, 点击sta ...

  9. HTML和JavaScript的D3文件放置位置和文件下载

    今天,接着补齐发文任务,我也是一个半黑不白的程序员了,不过,为照顾刚刚接触D3的小白朋友们,我把D3文件位置公布一下,如下图: 我是将D3文件放在一个文件夹下,所以,导入D3代码如下图: D3的文件下 ...

  10. vue兼容IE文件下载

    来了个下载文件的需求,使用blob开发完,测试的时候发现IE出现兼容问题,无法下载,下面是问题解决之后的代码. 发起请求的封装: 这里省略了一部分内容,重点是获取下载文件的文件名称 import ax ...

最新文章

  1. 基于Hadoop的大数据平台实施记——整体架构设计[转]
  2. mysql 使用手册 权限_创建MySQL用户及用户权限管理
  3. 将Button等控件嵌入到repeater中
  4. GPUImage滤镜中的shader代码分析,及自定义滤镜
  5. linux sdkMannger的打开
  6. 如何在Spring MVC Test中避免”Circular view path” 异常
  7. QTP User-Defined Function 学习经验汇总
  8. 关于Java中对于jsp文件的浅认识
  9. Problem D. Country Meow 2018ICPC南京
  10. H3C ACL 访问控制
  11. Python实现线程安全队列
  12. arcgis软件界面字体太小
  13. HTML+CSS基础知识2
  14. win7下安装python库的若干问题
  15. 超启发式算法(hyper heuristic)
  16. html div 360旋转动画效果,分享4种CSS3效果(360度旋转、旋转放大、放大、移动)
  17. 鸟瞰Atlassian认证
  18. Python入门学习笔记——12.文件操作
  19. Microbiome | 宏基因组测序中减少样品中真核宿主的DNA污染
  20. 描写火车站场景_描写春运火车拥挤的作文_火车站上

热门文章

  1. php下一页的代码,php 下一页的代码
  2. 用python玩微信(聊天机器人,好友信息统计)
  3. html左边是菜单右边是内容,左首菜单栏右侧内容
  4. java 生成二维码图片
  5. wamp php打不开,wamp无法打开phpmyadmin
  6. win10怎么在网络里查看win7计算机,win10看不到win7共享电脑怎么办_win10共享发现不了其他电脑的解决方法...
  7. mapgis明码文件转为点线面文件_Geomap格式转化.doc
  8. python网格交易法详解_期货交易技巧:等分网格交易法详解
  9. del 语句(基础篇)
  10. 初见Laravel框架