vue 导出excel接口哀求和axios返回值blob类型处置惩罚

打印 上一主题 下一主题

主题 1032|帖子 1032|积分 3096

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 导出功能vue文件代码
  1. // 导出
  2. const exportData = () => {
  3.         const param = {
  4.                 warehouseId: warehouseId.value,
  5.                 dispatchType: dispatchType.value,
  6.                 beginTime: rangeTime.value?.length ? rangeTime.value[0] : undefined,
  7.                 endTime: rangeTime.value?.length ? rangeTime.value[1] : undefined
  8.         }
  9.         otherAPI.exportActionStatistics(param, 'blob').then((res: any) => {
  10.                 let fileName = '任务统计'
  11.                 let url = window.URL.createObjectURL(new Blob([res.data]))
  12.                 let link = document.createElement('a')
  13.                 link.style.display = 'none'
  14.                 link.href = url
  15.                 link.id = 'Adownload'
  16.                 link.setAttribute('download', `${fileName}.xlsx`) //命名可能会出现问题,格式一定和后端下载的格式一样
  17.                 document.body.appendChild(link)
  18.                 link.click()
  19.         })
  20. }
复制代码
2. 接口方法代码
  1.         // 任务导出
  2.         exportActionStatistics(params: any, responseType: any) {
  3.                 const obj = {}
  4.                 if (params) {
  5.                         AiObject.cloneTo(params, obj)
  6.                 }
  7.                 return REST.request(HTTPMethod.GET, this.server + 'Statistics/ExportActionStatistics' + AiObject.toQueryString(obj), undefined, undefined, responseType)
  8.         }
复制代码
3. axios封装代码(REST.ts) 包罗导出接口报错时返回blob的数据处置惩罚
  1. const service = axios.create({
  2.         headers: {
  3.                 // 'Access-Control-Allow-Origin': '*',
  4.                 // 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
  5.                 // 'content-Type': 'application/json; charset=utf-8'
  6.         }
  7. })
  8. // 请求拦截
  9. service.interceptors.request.use(
  10.         (config: AxiosRequestConfig | any) => {
  11.                 // 增加一种情况授权,授权之后再登录
  12.                 if (window.sessionStorage.getItem('unlicensed') === '1') {
  13.                         // 系统未授权的判断要跑到未登录判断的前面。
  14.                 } else {
  15.                         const token = sessionStorage.getItem('token')
  16.                         if (token && config.headers) {
  17.                                 config.headers.Authorization = token
  18.                         } else {
  19.                                 Auth.singleton.logout()
  20.                         }
  21.                 }
  22.                 return config
  23.         },
  24.         (error: any) => {
  25.                 Promise.reject(error)
  26.         }
  27. )
  28. // 响应拦截
  29. service.interceptors.response.use(
  30.         (response) => Promise.resolve(response),
  31.         (error: any) => {
  32.                 // 授权失败
  33.                 if (error?.response?.status === HTTPStatus.Unlicensed) {
  34.                         window.sessionStorage.setItem('unlicensed', '1')
  35.                         Global.router.push({ path: '/lockdown' })
  36.                 } else if (error?.response?.status === HTTPStatus.Unauthorized) {
  37.                         Auth.singleton.logout()
  38.                 } else if (error && error.response) {
  39.                         if (error.response.data instanceof Blob) {
  40.                                 // 针对 Blob 类型错误处理
  41.                                 const res = error.response
  42.                                 const fileReader: any = new FileReader()
  43.                                 fileReader.readAsText(new Blob([res.data], { type: 'application/octet-stream' }), 'utf-8')
  44.                                 fileReader.onload = () => {
  45.                                         const { message } = JSON.parse(fileReader.result)
  46.                                         ElMessage({
  47.                                                 showClose: true,
  48.                                                 message: message,
  49.                                                 type: 'error'
  50.                                         })
  51.                                 }
  52.                         } else {
  53.                                 ElMessage({
  54.                                         showClose: true,
  55.                                         message: error.response.data.message,
  56.                                         type: 'error'
  57.                                         // duration: 0
  58.                                 })
  59.                         }
  60.                 } else {
  61.                         ElMessage.error('连接到服务器失败,请联系管理员')
  62.                 }
  63.                 return Promise.reject(error)
  64.         }
  65. )
复制代码
ResponseType传入判定 
  1.         static request(method: HTTPMethod, url: string, params?: string | number | { [key: string]: any }, className?: string, responseType?: ResponseType): AxiosPromise {
  2.                 // 如果有className 就得额外增加进去。
  3.                 if (typeof className === 'string') url += className
  4.                 // 确保参数符合 AxiosRequestConfig 接口。
  5.                 const config: AxiosRequestConfig = {
  6.                         method
  7.                 }
  8.                 if (responseType) {
  9.                         config.responseType = responseType as any
  10.                 }
  11.                 switch (typeof params) {
  12.                         case 'number':
  13.                         case 'string':
  14.                                 config.url = `${url}${params}`
  15.                                 break
  16.                         case 'object':
  17.                                 config.url = url
  18.                                 config.data = params
  19.                                 break
  20.                         default:
  21.                                 config.url = url
  22.                                 break
  23.                 }
  24.                 if (responseType) {
  25.                         config.responseType = responseType
  26.                 }
  27.                 return service(config)
  28.         }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表