Element|Element 组件导入Excel数据,如导入失败,如何直接下载带错误信息的 Excel()
项目使用的 Element 的 upload组件。
需求:
需求很简单,导入 Excel 数据,如果导入成功,提示‘导入成功’,如果导入失败,直接下载后端返回的 excel文件流。
遇到的问题
刚开始采取的是 upload组件 默认上传行为的方式,
但是由于upload组件默认是 post请求,请求时无法指定 responseType="blob",下载下来的excel表会提示文件损坏,无法打开。
贴下当时的代码:
上传错误时后端返回的文件流:
文章图片
【Element|Element 组件导入Excel数据,如导入失败,如何直接下载带错误信息的 Excel()】如果直接用后端返回的文件流 data创建Blob对象(blob = new Blob([data])),再用 URL.createObjectURL(blob) 得到一个url赋值给a标签,下载下来的文件是无法打开的。
文章图片
解决方案
采用 upload组件的 http-request,覆盖默认的上传行为,实现自定义上传。
文章图片
注意(重要):
- 请求时 responseType: "blob" 该参数必填,不然下载下来的excel表会提示文件损坏,无法打开
请求时,response = 'blob',
- 得到文件流,直接下载
- 得到 JSON 返回数据,需要展现 提示信息 或 错误信息,那么需要转换一下。因为请求失败时,后端返回的json对象,如:{"messsage":"备件异常","code":301,"success": false},也被转成了 blob。
- 思路:根据得到的 response.type 返回内容的 MIME TYPE 来判断:
下载文件 或 去做一些 JSON 数据提示的操作。 如果是 JSON类型 那就把 Blob 通过 readAsText 转为JSON格式。 这种方式应该是支持IE10和IE10以上版本,具体的自己查查。
文章图片
- 简略点 如何将数据 arraybuffer 转成 JSON 对象?
文章图片
该方法支持的浏览器自行查查。
推荐阅读
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- 没有导入future这个module
- 动态组件与v-once指令
- vue组件中为何data必须是一个函数()
- (六)Component初识组件
- Spring|Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
- R|R for data Science(六)(readr 进行数据导入)
- vuex|vuex 基础结构
- SwiftUI|SwiftUI iOS 瀑布流组件之仿CollectionView不规则图文混合(教程含源码)
- Vue组件之事件总线和消息发布订阅详解