导出文件,responseType设置为'arraybuffer',如果导出出错,后台返回错误信息应该怎么办?

1、正常导出的情况:(使用axios发送请求)后端返回二进制文件流

api:

//导出api

export function download(className,data){

return request({

url:'/api/'+className+'/export',

methods:'get',

params:data,

responseType:'arraybuffer',

})

}

// 调用api

this.$api.download(className,{name:nameCN,...this.searchForm}).then(res=>{

const data = new Blob([res],{type:'application/vnd.ms-excel'})

const url = URL.createObjectURL(data)

const a = document.createElement('a')

a.href = url

a.download = 'table.xls'

a.click()

URL.revokeObjectURL(url)

})

2、后来数据量过多导出出错,和后端约定,如果数据量过多则后端返回错误信息:

{
message: "数据量太大,建议导出数据不要超过6万以上"
retcode: "111111"
style: "PLAIN"
timestamp: 1570605714954
uri: "/api/zyBrfymxk/export"
}

由于请求的时候设置了responseType:'arraybuffer',返回的是数据流,要取得json信息需要进行转换:

let enc = new TextDecoder('utf-8')
let data = JSON.parse(enc.decode(new Uint8Array(res.data)))

// 调用api 改成:

this.$api.downloadXlsx(className,{name:nameCN,...this.searchForm}).then(res=>{
          try {
                let enc = new TextDecoder('utf-8')
                let data = JSON.parse(enc.decode(new Uint8Array(res.data)))
                this.$message({
                  message: data.message,
                  type: 'warning'
                });
                this.downloading = false
          } catch (error) {
                this.downloading = false
                const data = new Blob([res.data],{type:'application/vnd.ms-excel'})
                const url = URL.createObjectURL(data)
                const a = document.createElement('a')
                a.href = url
                a.download = nameCN+'.xlsx';
                a.click()
                URL.revokeObjectURL(url)
          }
        })

 

在jQuery中使用Ajax发送POST请求以导出表格时,如果你需要将数据导出文件(如CSV或Excel),后端通常会返回一个`Blob`对象或者`ArrayBuffer`。这是因为这两种数据类型可以直接用于创建文件下载。 - `Blob`(二进制大对象)是一个JavaScript内置对象,可以表示不可变、原始的数据,例如图片、音频或文本文件。它允许浏览器以流的形式处理大数据。 - `ArrayBuffer`是一个原始的、固定长度的、不可变的二进制数据结构,它是`Blob`的基础。后端可能会先将其转换成`ArrayBuffer`再返回。 当你从服务器获取到这两个其中之一时,可以在前端进行一些操作,比如: ```javascript $.ajax({ type: 'POST', url: '/export', data: yourFormData, processData: false, // 阻止jQuery默认处理数据 contentType: 'application/json', // 根据实际情况设置内容类型 success: function(response) { if (response instanceof Blob) { var blobURL = URL.createObjectURL(response); // 创建下载链接或使用HTML5 download属性 var a = document.createElement('a'); a.href = blobURL; a.download = 'yourFileName.csv'; // 设置下载名称 document.body.appendChild(a); a.click(); URL.revokeObjectURL(blobURL); // 下载完成后释放URL } else if (typeof response === 'object' && response.byteLength) { // 如果是ArrayBuffer var blob = new Blob([response], {type: 'application/octet-stream'}); // 同样地,这里创建下载链接 } }, error: function(xhr, status, error) { console.error('Export failed:', error); } }); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值