get/post(blob)请求导出文件

文章介绍了前端使用GET和POST请求进行文件导出的方法,包括window.open、window.location和<a>标签的使用。对于POST请求,重点在于通过判断Content-Type来处理成功或失败的情况,提供了一种优雅的错误提示方式。GET请求简单但错误信息覆盖原页面,而POST请求虽复杂但能更好地处理错误反馈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、get请求导出文件

1、window.open(url)

会自动打开一个标签页,下载完后会自动关闭这个标签页。

2、window.location(url) 或 location.href = url

在当前标签页下载。

3、< a href=“url” download=“filename”>点击链接下载< /a>

在当前标签页下载。

总结

优点:代码简单。

缺点:当导出失败时,返回的错误信息会覆盖原来的页面,错误信息可读性差。

二、post请求导出文件

1、思路

通过判断返回值的header.‘content-type’ 是否是 application/octet-stream,来确定文件导出是否成功!

content-type:

(1).application/octet-stream: 返回值类型为二进制流,即导出成功;

(2).application/json;charset=utf-8:返回值类型为json格式,即导出失败信息。由于我们请求的时候设置了responseType=‘blob’,所以返回值会被转换成二进制流。

  1. 实现
(1).接口处理类型(blob):
export const postExport = (params = {}) => {
  return http.post(`${baseURL}/api/demand/purchasingPlanExport`, (params), {responseType: 'blob'}).then(res => res.data)
}
(2).业务实现
// 接口请求函数
 postExportApi() {
// promise处理异步
      return new Promise((resolve) => {
//  postExport(),接口地址
        postExport().then((res) => {
           // 导出失败,返回错误信息
          if (res.type !== 'application/octet-stream') {
           // 将返回的blob格式的返回值,转成对象,取出Response数据
             new Response(res.data).text().then((res) => {
              console.log(res);
          })
          } else {
        // downloadName 定义文件夹名称
            let downloadName = `采购计划.xlsx`;
        //  使用blob函数下载文件
            let blob = new Blob([res], { type: `application/vnd.ms-excel` });
            let downloadElement = document.createElement("a");
            let href = window.URL.createObjectURL(blob);
            downloadElement.href = href;
            downloadElement.download = downloadName;
            document.body.appendChild(downloadElement);
            downloadElement.click();
            document.body.removeChild(downloadElement);
            window.URL.revokeObjectURL(href);
            this.$refs["modal"].show = false;
          }
        });
      });
    },
总结

优点:当导出失败时,可以以一种更优雅的方式展示错误提示信息。

缺点:代码复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

韩召华

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

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

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

打赏作者

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

抵扣说明:

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

余额充值