vue Excel下载乱码

文章讲述了作者在处理前端下载功能时遇到乱码问题,经过调试发现responseType未设置导致axios无法识别blob类型。作者揭示了mockjs默认设置的问题,并提供了解决方案,即确保在请求中设置responseType或关闭mockjs以修复编码问题。
摘要由CSDN通过智能技术生成

对于这个问题,搞了我两天,心态都给我怎崩溃了。各种百度上搜,基本都是同一代码。打死我都不信,结果依然是乱码。

export function Usb_download(params) {
	return request({
		url: api.UsbDownload,
		responseType: 'blob', //arraybuffer也可以
		params
	})
}

/* 条件下载 */
    dowloadClick() {
      this.downLoading = true;
      let query = _.cloneDeep(this.searchFormProps.query);
      query.status=this.status
      this.queryValue(query);
      //获取下载文件名
      this.$message.info("请求下载中...");
      callBack_download({ ...query })
        .then((res) => {
           this.downloadFile(res)
        })
        .catch(() => {
          this.$message.error("下载失败");
        })
        .finally(() => {
          this.downLoading = false;
        });
    },
    downloadFile(res) {
      let blob = new Blob([res], {
        type: "application/vnd.ms-excel;charset=UTF-8",
      });
      let downloadElement = document.createElement("a");
      let href = window.URL.createObjectURL(blob); //创建下载的链接
      downloadElement.href = href;
      //获取文件名
      document.body.appendChild(downloadElement);
      downloadElement.click(); //点击下载
      document.body.removeChild(downloadElement); //下载完成移除元素
      window.URL.revokeObjectURL(href); //释放掉blob对象
    },

基本用了各种方法,依然是乱码。然后后面我打印axios请求

我就发现,请求的resposeType是空,不是blob类型,识别不了,一直下载文件都是乱码,搞得我真想骂人了,到底是怎么回事,后来搜到一个博主,终于让我找到原因了

 原来在本项目中使用了mockjs来模拟请求后端接口获得数据,然而我看了下代码,mock并没有对这个下载接口做拦截啊,那为什么这个接口返回blob有问题了,于是我看了下mockjs的源码,大概知道原因在那了

mockjs初始化的时候给拦截响应设置了responseType:'',那就把mockjs给注释掉。后来我把mock注释掉了,重启一下项目就好了。

心累呀,找个解决问题,刚开始后端都在找原因,怀疑自己是不是写错了

还有一种情况,就是ajax自己用promise封装的,没有设置responseType,也会照成乱码

function ajax(req) {
  return new Promise((resolve) => {
    Axios.request({
      url: req.url,
      method: req.method || 'GET',
      data: req.data || {},
      params: req.params || {},
    })
      .then((d) => {
        resolve(d)
      })
      .catch((err) => {
        resolve(err)
      })
  })
}

export default ajax

加上responseType就解决了

function ajax1(req) {
  return new Promise((resolve) => {
    Axios.request({
      url: req.url,
      method: req.method || 'GET',
      data: req.data || {},
      params: req.params || {},
      responseType:req.responseType||""
    })
      .then((d) => {
        resolve(d)
      })
      .catch((err) => {
        resolve(err)
      })
  })
}

export default ajax1

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清爽豆干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值