vue-axios下载文件流blob,ie下载报传递给系统调用的数据区域太小.ie文件流下载报错;文件下载失败将blob的错误信息转换成json格式

本次下载是后台文件流传输,前端下载,前端将拿到的下载id和名称downloadName传递给下载方法;如果是多个下载,可以采用数组for循环

情景描述:
1.如果符合导出条件, 后端直接返回数据流,如下图所示的一堆看不懂的东西:
在这里插入图片描述
在这里插入图片描述

2.不满足导出条件, 则后端返回JSON, 并附上失败原因, 前端需要将失败原因展示出来

解决问题:

  • 兼容ie浏览器下载报传递给系统调用的数据区域太小.
  • 解决blob下载文件,文件下载失败将blob的错误信息转换成json格式
    //下载downloadFile() {let obj = {loginUser: this.$store.state.loginUser,id: this.visibleId,};axios.post(this.$store.state.windowCONTENT + "myDownload/downloadFile",obj,{responseType: "blob",}).then((res) => {// console.log(res.data.type);// alert(res.data.type);//此时有点两种情况,1.后端返回的是个对象而不是文件,但是被我们获取时候转成了blob,导致我们没法做判断。//例如{data:"参数异常,无下载权限",message:"INPUT_PARAMETER_CHECK_ERROR",success:7}//故需要将获取到的blob类型做判断,如果是application/json ---谷歌下的对象转blob的类型,或者application/json;charset=utf-8---ie下的对象转blob的类型//然后在再讲此blob转成原对象做判断if (res.data.type.includes('application/json')) {//以下部分代码是将原来的{}json对象转成的blob文件流,重新再读写成json对象做判断let reader = new FileReader()reader.onload = (event) => {let content = JSON.parse(reader.result)console.log(content);let message = content.message // 错误信息let status = content.success //状态码// 错误处理--根据后端实际返回的对象做判断if (status == 7) {alert(message);} else if (status == 9) {}}reader.readAsText(res.data)return true} else {if ("msSaveOrOpenBlob" in navigator) {//兼容ie浏览器下载报传递给系统调用的数据区域太小.var data = res.data;var blob = new Blob([data], { type: "application/vnd.ms-excel" });window.navigator.msSaveOrOpenBlob(blob, this.downloadName);return;} else {// console.log(res.data);const blob = res.data;const reader = new FileReader();reader.readAsDataURL(blob);reader.onload = (e) => {const a = document.createElement("a");a.download = this.downloadName; //点击下载时候传递过来的文件名称包括本身的格式 例如   帮助文档.doca.href = e.target.result;// console.log(e.target.result);document.body.appendChild(a);a.click();document.body.removeChild(a);};}}}).catch((err) => {console.log(err.message);});},
  • 可参考链接

2.地址栏方式下载:一般接口返回下载地址

    // 下载download(id) {queryPdf(id).then(res => {if (res.code === 200) {const a = document.createElement('a')a.style.display = 'none'a.setAttribute('href', res.data)a.click()}})},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端开发框架对比

From: https://www.cnblogs.com/xtdxs/p/6540933.html 本文选取了 Bootstrap、jQuery UI、jQuery Mobile、Sencha ExtJS、Sencha Touch、Sencha GXT、Dojo、Dojo Mobile、Mootools、Foundation、YUI、Kissy、QWrap 等 16 个国内外前端开发框架进行初步的横向比较,可…

持续集成工具FinalBuilder使用心得

FinalBuilder 使用这款自动化创建和发布管理工具,软件开发者可以定义和维护一个可靠的以及可重复创建的程序。FinalBuilder包括集成的带有版本的控制系统,文件和目录选项,重复器,源代码编译,测试工具,数据库…

yarn安装依赖包报错 error An unexpected error occurred: “https://registry.npm.taobao.orgnpm/element-ui: get

yarn安装依赖包报错,error An unexpected error occurred: “https://registry.npm.taobao.orgnpm/element-ui: getaddrinfo ENOTFOUND registry.npm.taobao.orgnpm registry.npm.taobao.orgnpm:443”. 这是因为网络不好导致的下载依赖包请求超时报错,…

从零开始搭建自己的VueJS2.0+ElementUI单页面网站(一、环境搭建)

From: https://blog.csdn.net/u012907049/article/details/72764151 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012907049/article/details/72764151 前言 VueJS可以说是近些年来最火的前端框架之一,越…

解决微信小程序报[ app.json 文件内容错误] app.json: app.json 未找到,未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译。小程序app.json报错

编译报错:[ app.json 文件内容错误] app.json: app.json 未找到 原因:由于project.config.json文件的miniprogramRoot小程序根目录属性找不到aap.json的路径(可能是错误的路径,也可能是没有这一行代码); &…

css3新单位vw、vh、vmin、vmax的使用详解(附样例)

From: http://www.hangge.com/blog/cache/detail_1715.html 像 px、em 这样的长度单位大家肯定都很熟悉,前者为绝对单位,后者为相对单位。CSS3 又引入了新单位:vw、vh、vmin、vmax。下面对它们做个详细介绍。 一、基本说明 1,vw…

数据结构之递归

第一篇:数据结构之链表 第二篇:数据结构之栈和队列 第三篇:数据结构之二叉树 第四篇:数据结构之排序 第五篇:数据结构之字符串 在这篇文章里,我们主要讨论和递归相关的话题。递归是数据结构中解决复杂问题时…

HBuilderX搭建微信小程序;HBuilderX开发uni-app微信小程序;uni-app开发微信小程序;使用uni-app搭建微信小程序;使用uni-ui模板搭建微信小程序步骤

1.选择模板 uni-ui 2.得到创建项目 3.获取APPid 在微信小程序电脑后台获取APPID 这个方法适用于自己申请的微信小程序(自己用的小程序) 打开微信小程序官网:https://mp.weixin.qq.com/ 并登陆 4.项目打包 打包后运行在微信小程序工具 才…

vh,vw单位你知道多少?

From: https://mp.weixin.qq.com/s/G7ZYCiO__4g2LjRuNl32Ew 响应式布局的单位我们第一时间会想到通过rem单位来实现适配,但是它还需要内嵌一段脚本去动态计算跟元素大小。 比如: (function (doc, win) { let docEl doc.documentElement let resizeEvt…

为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?

排序算法对结果的唯一要求就是操作数满足全序关系: 如果 a≤b 并且 b≤c 那么 a≤c(传递性)。 对于 a 或 b,要不 a≤b,要不 b≤a(完全性)。这个问题可以用信息论来回答。 我从 1 到 5 中挑一个数…

iTerm2分屏时,如何使得新窗口的当前路径和前一个窗口一样?

From: https://segmentfault.com/q/1010000005355758 Preferences 里面设置 Working Directory 为 reuse previous sessions directory

全国80几所重点大学ftp资源库(经常逛逛可能有惊喜哦)很难收集的,知道其他的友友可以留言完善...

2019独角兽企业重金招聘Python工程师标准>>> 重庆交通大学外国语学院ftp \\202.202.240.93/ 密码:a 帐号:as 电子科技大学ftp    ftp://xsc. cuit. edu. cn/   大连理工大学    ftp://ftp. dlut. edu. cn   上海交通大学    ftp://mssite. sjtu. …

python发送包含html、图片、附件和链接的邮件

从我的126邮箱给我的QQ邮箱发送测试邮件 1.smtplib模块的使用 smtplib库用来发送邮件。需要用到的函数如下: 连接到SMTP服务器,参数为SMTP主机和端口: SMTP.connect([host[,port]]) 登录SMTP服务器,参数为邮箱用户名和密码&#x…

apiCloud中Frame框的操作,显示与隐藏Frame

Frame是一层一层的概念, 有的位于上层,有的位于下层。 1.加载菜单 2.加载页面层 3.首页拆分出内容层,这个时候内容层位于页面层的上方,当点击其他页面的时候,内容层遮挡住了他们 解决方案一 判断是否是首页&#xff0c…

迅雷Chrome插件引发的Uncaught ReferenceError: xl_chrome_menu is not defined JS报错

前几天发现我也有这问题 具体是点击某个button 会出这错。 倒是没啥影响不过用chrome控制台调试的时候比较烦 baidu了下 都说卸掉迅雷。。但是出于程序员的角度还是想解决掉BUG 我的方法是 找到对应的xl.js文件。、 找不到? 直接到chrome文件夹下搜索下xl.js就好了。…

学习《css世界》笔记之使用css实现凹凸效果

显示效果 HTML <span class"ao"></span> <span class"tu"></span>CSS .ao,.tu{display: inline-block;width: 0;font-size: 14px;line-height: 18px;margin: 35px;/* color: #fff; *//* 文字颜色 */}.ao:before,/* :before的主…

IO调度算法

IO调度算法的选择 一) I/O调度程序的总结 1) 当向设备写入数据块或是从设备读出数据块时,请求都被安置在一个队列中等待完成. 2) 每个块设备都有它自己的队列. 3) I/O调度程序负责维护这些队列的顺序,以更有效地利用介质.I/O调度程序将无序的I/O操作变为有序的I/O操作. 4) 内核…

ORA-01555 原因与解决

ORA-01555 原因与解决&#xff1a; 前面提到了ORA-01555错误&#xff0c;那么现在来看一下ORA-01555错误是怎样产生的。由于回滚段是循环使用的&#xff0c;当事务提交以后&#xff0c;该事务占用的回滚段事务会被标记为非活动&#xff0c;回滚段空间可以被覆盖重用。那么一个问…

使用css优雅解决文字两端对齐的方式之一

效果图 HTML <body><div>学校</div><div>班级</div><div>班主任</div><div>上课时间</div><div>名字</div></body>CSS div {margin: 10px 0;width: 70px;border: 1px solid brown;text-align: just…

学习《css世界》笔记之loading三点动画效果

动画实例 HTML <div>正在加载中<span>...</span></div>CSS span {display: inline-block;height: 1em;line-height: 1;text-align: left;vertical-align: -0.25em;/* 属性设置元素的垂直对齐方式。指定为负长度&#xff0c;可以使元素降低 */overfl…