vue3文件下载

效果图

template

<el-table-column prop="fileName" label="附件">
        <template #default="scope">
            <a href="##" @click.prevent="fDownloadHandler(scope.row.fileId)">{{scope.row.fileName}}</a>
        </template>
      </el-table-column>

接口文件

需要添加 responseType: ‘blob’,

export function filedownloadList(data){
    return service({
        url:'/Wjgl/getFile',
        method:'post',
        params:data,
        responseType: 'blob',
    })
}

js

// 下载文件
const fDownloadHandler = (id) => {
  filedownloadList({ fileId: id }).then((res) => {
    // console.log(res,888); // 控制台输出:Blob {size: 30208, type: 'application/x-msdownload'}
    // return
    let fileName = res.headers["content-disposition"].split(";")[1].split("=")[1]; //后端携带在相应头的文件名称
    let blob = new Blob([res.data], { type: "application/octet-stream" }); // 根据服务器端返回的数据类型设置文件类型
    let link = document.createElement("a");
    link.href = URL.createObjectURL(blob);
    link.download = fileName;
    link.click();
    setTimeout(() => {
      URL.revokeObjectURL(link.href);
    }, 100);
  });
};

遇到的坑

控制台没有输出Blob {size: 30208, type: ‘application/x-msdownload’},并发现后端返回的数据res没有headers。

解决

在接口的index.js文件的响应拦截器里面需要返回response,而不是response.data

// 添加响应拦截器
service.interceptors.response.use(
  function (response) {
      if (response.data.code == '401'){
        localStorage.clear();
        location.href = "/";
      }
        // 状态403,权限认证失败
  if (response.data.code==403){
closeLoading();
    return response.data;
  }
 // 状态403,系统异常
 if (response.data.code==500){
closeLoading();
  return response.data;
}
    let responseData = response.data;
    let responseDataCode = response.data.code;
    // 状态200,操作成功
closeLoading();
    if (responseDataCode == 200) {
      // console.log('data');
      return response.data;
    }
    if (response.status == 200) {
      // 重点!!!
      return response
    }
    if(!response.Blob ){
      // console.log('Blob');
      ElMessage({
        type: 'error',
        message: responseData.message,
      })
    }
  return response;
}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  return Promise.reject(error);
});
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值