前端Ajax接收文件流,实现下载excel文件并解决乱码问题

后端(express):

Access-Control-Expose-Headers:暴露响应头供前端使用(Content-Disposition)

router.post("/downExcel", (req, res) => {
  let assetsPath = path.resolve(__dirname, "../assets/1.xlsx");
  res.set("Access-Control-Expose-Headers", "Content-Disposition");
  // res.set("Content-Type", "application/vnd.ms-excel");
  res.set("Content-Type", "application/octet-stream");
  res.set("Content-Disposition", `attachment; filename=mino.xlsx`);
  fs.createReadStream(assetsPath).pipe(res);
});

前端:

1. 原生XHR版

let xhr = new XMLHttpRequest();
xhr.responseType = "arraybuffer";
xhr.open("post", "http://127.0.0.1:8080/download/downExcel", true);
xhr.onreadystatechange = function () {
  if (this.readyState == 4 && this.status == 200) {
    let [_, fileName] = this.getResponseHeader(
      "Content-Disposition"
    ).match(/filename=(.*)$/);
    let blob = new Blob([xhr.response], {
      type: "application/vnd.ms-excel",
    });
    let link = document.createElement("a");
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;
    link.click();
    window.URL.revokeObjectURL(link.href);
  }
};
xhr.send();

2. jQuery版

$.ajax({
  method: "post",
  url: "http://127.0.0.1:8080/download/downExcel",
  xhrFields: {
    responseType: "arraybuffer",
  },
  success: function (res, _, xhr) {
    let [, fileName] = xhr
      .getResponseHeader("Content-Disposition")
      .match(/filename=(.*)$/);
    let blob = new Blob([res], {
      type: "application/vnd.ms-excel",
    });
    let link = document.createElement("a");
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;
    link.click();
    window.URL.revokeObjectURL(link.href);
  },
});

进阶:使用断点续传下载、上传文件 - 206


Q:使用swagger-ui请求接口,返回的文件没有乱码,一旦使用jQuery接收文件流,获取的excel有乱码:

A:      设置responseType时格式错误;要使用xhrFields。

$.ajax({
    ...
    responseType: 'blob' // 无效
    ...
})

 

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
首先,你需要在前端使用ajax向后端发送请求,并在请求中设置responseType为blob,以便获取二进制数据。同时,你需要在后端将excel文件转换成二进制数据并返回给前端。 以下是一个使用jQuery前端示例代码: ```javascript $.ajax({ url: 'your-backend-url', method: 'POST', responseType: 'blob', // 设置返回数据类型为二进制 success: function(data) { // 创建一个a标签,将二进制数据转换为URL,并设置下载属性 var a = document.createElement('a'); var url = window.URL.createObjectURL(data); a.href = url; a.download = 'file.xls'; // 将a标签添加到文档中,并自动触发点击事件下载文件 document.body.appendChild(a); a.click(); // 下载完成后,释放URL对象 window.URL.revokeObjectURL(url); } }); ``` 在后端,你可以使用EPPlus或NPOI等库来将Excel文件转换为二进制数据,并将其作为响应返回给前端。以下是一个使用EPPlus的后端示例代码: ```csharp using OfficeOpenXml; // ... [HttpPost] public IActionResult DownloadExcel() { // 读取Excel文件 var fileInfo = new FileInfo("path/to/file.xlsx"); using (var package = new ExcelPackage(fileInfo)) { // 获取工作表 var worksheet = package.Workbook.Worksheets[0]; // 将工作表转换为二进制数据 var data = worksheet.ConvertToBinary(); // 返回二进制数据 return File(data, "application/vnd.ms-excel", "file.xls"); } } ``` 注意,以上代码仅供参考,具体实现可能会因为框架和库的不同而有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值