前端通过new Blob下载文档流(下载zip或excel)

本文介绍了如何在前端使用axios请求后端获取预览数据,通过设置responseType为blob并处理返回的Blob对象,实现不同格式文件(如zip和Excel)的下载。同时提及了通过window.location.href间接下载的情况以及Vite的proxy配置。
摘要由CSDN通过智能技术生成

当后端返回这样的预览:

前端该如何下载呢?首先在axios请求里,加入第三个参数{ responseType: 'blob' }。

proxy.$post(url, params, { responseType: 'blob' }).then((res)=>{
  downloadFormat(res)
});

然后在一个函数里处理返回,创建a标签来下载

// 这里是下载zip文件的处理

const downloadFormat = (res) => {
  if (!res.data) {
    return;
  }
  let stringName = res.headers['content-disposition'].split(';')[1];// 一般来说,文件名字后端都在返回头里,前后端可以约定文件名前用 @ 符号分隔,便于取值,用其他符号也可以。
  let fileName = stringName.split('=')[1];// 获取到了后缀名
  let blob = new Blob([res.data], { type: 'application/zip' }); // application/zip就是设置下载类型,需要设置什么类型可在标题二处查看,
  const url = window.URL.createObjectURL(blob); // 设置路径
  const link = window.document.createElement('a'); // 创建a标签
  link.href = url;
  link.setAttribute('download', fileName); // 给下载后的文件命名
  link.style.display = 'none';
  link.click();
  URL.revokeObjectURL(url); // 释放内存
}

// 这里是下载excel的处理, 可根据需要传文件名和文件类型

const downloadFormat = (res, fileName, fileType) => {
  if (!blob) {
    return;
  }
  const url = window.URL.createObjectURL(
    new Blob([blob], { type: fileType ?? 'application/vnd.ms-excel' })
  );

  const link = document.createElement('a');
  link.style.display = 'none';
  link.href = url;
  link.setAttribute('download', fileName);

  document.body.appendChild(link);
  link.click();
  window.URL.revokeObjectURL(url); // 为了更好地性能和内存使用状况,应该在适当的时候释放url.
}

还有一种get方式通过window.location.href来下载文件,在浏览器F12网络里预览和响应没有返回值,写法如下

window.location.href = '/api/exportData?ids=' + 拼接的参数

其中/api被代理转发了,在vite.config.js文件里config.server.proxy对象配置如下:

"/api": {
  target: "https://test.XXX.net",
  secure: false,
  changeOrigin: true,
}

// 真实请求地址含api,并未被reWrite为空

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在 Vue下载Blob文件的格式不正确,可能是因为响应头中的 Content-Type 属性不正确。例如,如果下载的是一个 JAR 文件,但响应头中的 Content-Type 是 `application/octet-stream`,浏览器就会将其识别成二进制文件,而不是 JAR 文件。 解决该问题的方法是,手动设置响应头中的 Content-Type 属性。在后端代码中,可以通过设置响应头中的 Content-Type 属性为 `"application/java-archive"`,来告诉浏览器下载的是一个 JAR 文件。例如,在 Java Spring Boot 中可以使用如下代码: ```java @GetMapping("/download") public ResponseEntity<byte[]> download() { byte[] content = // 获取文件数据 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", "file.jar"); return new ResponseEntity<>(content, headers, HttpStatus.OK); } ``` 在上面的代码中,我们通过 `HttpHeaders` 对象设置了响应头中的 Content-Type 属性为 `"application/java-archive"`,并使用 `setContentDispositionFormData` 方法设置了文件名为 `"file.jar"`。 在前端代码中,可以直接使用之前提到的方法下载文件: ```javascript axios({ url: 'your-api-url', method: 'get', responseType: 'blob' // 表示返回类型为 Blob }).then(res => { const content = res.data; const blob = new Blob([content], { type: 'application/java-archive' }); const fileName = 'file.jar'; // 文件名 const link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = fileName; // 下载文件名 link.click(); window.URL.revokeObjectURL(link.href); }); ``` 在上面的代码中,我们手动设置了 Blob 对象的类型为 `"application/java-archive"`,以确保浏览器正确识别该文件的格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值