亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue后端傳文件流轉(zhuǎn)化成blob對(duì)象,前端點(diǎn)擊下載返回undefined問(wèn)題

 更新時(shí)間:2022年12月07日 10:31:23   作者:牛先森家的牛奶  
這篇文章主要介紹了vue后端傳文件流轉(zhuǎn)化成blob對(duì)象,前端點(diǎn)擊下載返回undefined問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue后端傳文件流轉(zhuǎn)化成blob對(duì)象,前端點(diǎn)擊下載返回undefined

效果如下

處理后的返回

<template>
  <div class="content-box">
    <div class="container">
      <div>。。。</div>
    </div>
  </div>
</template>

<script>
import {  exportProjectStandard } from '@/api/brand/standard'

export default {
  props: {},
  data() {
    return {}
  },
  methods: {
    gotoExport(row){
      // console.log(row);
      try {
        // window.location.href = `${ process.env.VUE_APP_BASE_BRAND_API }/v1/inspectionstandard/exportProject?id=${row.id}&standardName=${row.title}`
        // window.open(`${ process.env.VUE_APP_BASE_BRAND_API }/v1/inspectionstandard/exportProject?id=${row.id}&standardName=${row.title}`)
        // this.$message.success('數(shù)據(jù)導(dǎo)出中,請(qǐng)稍等')
        
        // 調(diào)接口文件流形式
        let parmas = {
          id: row.id,
          standardName: row.title
        }
        exportProjectStandard(parmas).then(res => {
          console.log(res);
          // 因?yàn)楹蠖酥苯臃祷氐木褪莃lob數(shù)據(jù)流格式
          // if (res.code == 200) {
            const content = res;
            const blob = new Blob([content])
            const fileName = row.title + '.xls';  //自定義下載文件的名字
            if ('download' in document.createElement('a')) { // 非IE下載
              const elink = document.createElement('a');
              elink.download = fileName;
              elink.style.display = 'none';
              elink.href = URL.createObjectURL(blob);
              document.body.appendChild(elink);
              elink.click();
              URL.revokeObjectURL(elink.href); // 釋放URL 對(duì)象
              document.body.removeChild(elink);
            } else { // IE10+下載
              navigator.msSaveBlob(blob, fileName);
            }
          // }
        }).catch((error) => {
          this.$message.error('導(dǎo)出異常,請(qǐng)稍后重試')
        	console.log(error.response)   //可獲取錯(cuò)誤的返回信息
          if (error.response.status == 400) {}
        }).finally(() => {})
      } catch (error) {
        this.$message.error('導(dǎo)出失敗')
      }
    }
  }
}
</script>

<style lang="scss" scoped>

</style>

如圖blob文件流格式

在這里插入圖片描述

封裝的方法如下

import axios from 'axios'
// import { Message } from 'element-ui'
import store from '@/store'
import { goLoginPage } from '@/utils'
import { getAccessToken, getRefreshToken, getAccessTokenTTL } from '@/utils/auth'

const SYSTEM_APPID = process.env.VUE_APP_SYSTEM_APPID
let isRefreshing = false // 是否正在刷新token
let requests = [] // 請(qǐng)求隊(duì)列

const exculdeUrls = ['/xxx/authorize/generateToken', '/xxx/authorize/refreshToken']

function checkExculdeUrls(url) {
  let flag = false
  exculdeUrls.map(item => {
    if (url.indexOf(item) >= 0) flag = true
  })
  return flag
}

function noTokenData() {
  return !getAccessToken() || !getRefreshToken() || !getAccessTokenTTL()
}

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_BRAND_API,
  // withCredentials: true,
  timeout: 300000
})

service.interceptors.request.use(
  config => {

    // 不需要驗(yàn)證token的接口
    if (checkExculdeUrls(config.url)) {
      return config
    }

    // token數(shù)據(jù)丟失
    if (noTokenData()) {
      console.log('token數(shù)據(jù)丟失');
      goLoginPage()
    }

    if (new Date().getTime() >= getAccessTokenTTL()) {
      // accessToken失效,接口放入隊(duì)列,并刷新token
      if (!isRefreshing) {
        isRefreshing = true;
        const sData = {
          appID: SYSTEM_APPID,
          refreshToken: getRefreshToken(),
          timestamp: new Date().getTime(),
          version: '1.0'
        }
        store.dispatch('user/refreshToken', sData).then(res => {
          isRefreshing = false
          return res.item.accessToken
        }).then(token => {
          requests.forEach(cb => cb(token))
          requests = []
        }).catch(err => {
          isRefreshing = false
          console.error('refresh token error: ', err)
        })
      }
      const retryOriginalRequest = new Promise((resolve) => {
        requests.push((token) => {
          config.headers['Authorization'] = token
          resolve(config)
        })
      })
      return retryOriginalRequest
    } else {
      // accessToken有效
      const token = getAccessToken()
      if (token) {
        config.headers['Authorization'] = token
      }

      return config
    }
  },
  error => {
    console.log(error)
    return Promise.reject(error)
  }
)

service.interceptors.response.use(
  response => {
    return response.data
  },
  error => {
    // const errMsg = (error.response && error.response.data && error.response.data.message) || error.message
    // Message({
    //   message: errMsg,
    //   type: 'error'
    // })
    switch (error.response.data.code) {
      case 910005: // 返回910005 缺失accessToken
      case 910006: // 返回910006 獲取SESSIONID失敗
      case 910007: // 返回910007 accessToken過(guò)期
      case 910008: // 返回910008 找不到用戶信息
      case 910009: // 返回910007 refreshToken過(guò)期
        goLoginPage()
        break
      default:
        console.log('err' + error)
    }
    return Promise.reject(error)
  }
)

//上傳附件axios接口封裝
const upload = {
  uploadFile(url, payload, cancelToken, cd) {
    return service({
      url: url,
      method: "post",
      data: payload,
      onUploadProgress: function(progressEvent) {
        if (cd && progressEvent.lengthComputable) {
          cd(progressEvent);
        }
      },
      cancelToken: cancelToken,
    });
  },
}
export {
  upload,
  service,
}
export default service

import request from '@/utils/request'

// 導(dǎo)出標(biāo)準(zhǔn)接口
export function exportProjectStandard(params){
  return  request({
    url: '/v1/inspectionstandard/exportProject',
    timeout: 60 * 60 * 60 * 1000, // 設(shè)置請(qǐng)求超時(shí)時(shí)間
    xhrFields: {
      withCredentials: true
    },
    method:'get',
    params,
    responseType: 'blob',
  });
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue3響應(yīng)式API之ref的使用

    vue3響應(yīng)式API之ref的使用

    這篇文章主要介紹了vue3響應(yīng)式API之ref的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue路由vue-router詳細(xì)講解指南

    Vue路由vue-router詳細(xì)講解指南

    這篇文章主要介紹了Vue路由vue-router詳細(xì)講解指南,對(duì)vue-router感興趣的同學(xué),可以參考下
    2021-04-04
  • vue3父子通信ref,toRef,toRefs使用實(shí)例詳解

    vue3父子通信ref,toRef,toRefs使用實(shí)例詳解

    這篇文章主要介紹了vue3父子通信ref,toRef,toRefs使用實(shí)例詳解,分別介紹了ref是什么、toRef是什么及toRefs是什么和最佳使用方式,結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • elementUI踩坑記錄-el-table問(wèn)題

    elementUI踩坑記錄-el-table問(wèn)題

    這篇文章主要介紹了elementUI踩坑記錄-el-table問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 前端vue數(shù)組去重的三種方法代碼實(shí)例

    前端vue數(shù)組去重的三種方法代碼實(shí)例

    數(shù)組去重是我面試時(shí)候經(jīng)常會(huì)問(wèn)到應(yīng)聘者的一個(gè)問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于前端vue數(shù)組去重的三種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • 如何修改element-ui日期下拉框datetimePicker的背景色樣式

    如何修改element-ui日期下拉框datetimePicker的背景色樣式

    這篇文章主要介紹了修改element-ui日期下拉框datetimePicker的背景色樣式的操作代碼,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Vue組件的繼承用法示例詳解

    Vue組件的繼承用法示例詳解

    這篇文章主要介紹了Vue組件的繼承用法,本文通過(guò)實(shí)例代碼案例講解給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Vue.js2.0中的變化小結(jié)

    Vue.js2.0中的變化小結(jié)

    最近小編在學(xué)習(xí)vue.js ,發(fā)現(xiàn)里面有好多好玩的東東,今天小編給大家分享Vue.js2.0中的變化,小編會(huì)在日后給大家持續(xù)更新的,感興趣的朋友參考下吧
    2017-10-10
  • Vue非父子組件通信詳解

    Vue非父子組件通信詳解

    這篇文章主要為大家詳細(xì)介紹了Vue非父子組件通信的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Vue3實(shí)現(xiàn)組件級(jí)基類的多種方法

    Vue3實(shí)現(xiàn)組件級(jí)基類的多種方法

    vue3提供了 mixins和extends,但是嘗試之后發(fā)現(xiàn)這兩種方法只支持純OptionAPI,設(shè)置的data會(huì)被識(shí)別,但是設(shè)置的setup里return 的 reactive,完全無(wú)效,setup也沒(méi)有被執(zhí)行,這篇文章主要介紹了Vue3實(shí)現(xiàn)組件級(jí)基類的幾種方法,需要的朋友可以參考下
    2023-04-04

最新評(píng)論