vue axios根据文件流 导出excel表并处理服务端异常状况

需求:导出记录列表 excel
描述:后端POST接口请求返回文件流,前端处理文件流转换成下载地址并下载
状况:下载可能会超时或者登录失效,需要处理后端返回来的json 数据
download(url, params) {
		axios({
			headers: {
				'Content-Type': 'application/x-www-form-urlencoded'
			},
			method: 'post',
			url: url,
			timeout: 60 * 10 * 1000, // 单独设置超时时间  导出记录太多的话会很慢 防止超时
			data: Qs.stringify(params), 
			responseType: 'blob' // 二进制流文件,一定要设置成blob,默认是json 
		}).then((res) => {
			const data = res.data
			let blob = new Blob([data],{type: 'application/vnd.ms-excel'});   // 文件格式设置
			const r = new FileReader()
			r.readAsText(blob)  //  FileReader的API   必须为readAsText
			r.onload = function(e) {				
				try {
					const resData = JSON.parse(this.result) // this.result为FileReader获取blob数据转换为json后的数据,即后台返回的原始数据  这里获取成功  说明下载出错了
					//以下进行后续处理   根据自己需求修改
					if(resData.code == -2) {   // 这里后台给我返回code=2 代表 登录过期了
						window.localStorage.clear();
						window.sessionStorage.clear();
						ElementUI.Message({
							message: "登录失效",
							type: "warning",
						});
						router.push({
							name: 'login'
						});
						return false;
					}
					
					if(resData.code == -1) { // 这里后台给我返回code=1 代表 服务端报错了
						window.localStorage.clear();
						window.sessionStorage.clear();
						ElementUI.Message({
							message: "服务器内部发生错误了",
							type: "warning",
						});
						router.push({
							name: 'login'
						});
						return false;
					}
				} catch(err) {
					// 下面是正常处理   返回的是文件流
					let fileName = params.excelFileName  // 文件名
					// 兼容ie11
					if(window.navigator.msSaveOrOpenBlob) {
						try {
							const blobObject = new Blob([data])
							window.navigator.msSaveOrOpenBlob(blobObject, fileName+ ".xlsx")  // 记得加文件名 和 文件扩展名
						} catch(e) {
							console.log(e)
						}
						return
					}
					// a标签实现下载
					let url = window.URL.createObjectURL(new Blob([data]))
					let link = document.createElement('a')
					link.style.display = 'none'
					link.href = url
					link.setAttribute('download', fileName+ ".xlsx")
					document.body.appendChild(link)
					link.click()					
				}
			}
			

		}).catch(res => {
             //  ...
		})
	},
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值