You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js服务端调用外部API返回损坏Zip文件问题及解决

在Next.js/Node.js环境中正确接收POST返回的XLSX文件

我遇到一个问题:调用一个返回XLSX文件的POST接口时,用Next.js服务端API请求会得到损坏的Zip文件,但Postman直接调用却能正常获取XLSX文件。最初的代码如下:

axios.post(`${process.env.API_URI}`, formData, {
        headers: {
          ...formData.getHeaders(),
        },
         responseType:"blob"
      }).then(response => {
         res.status(200).send(response.data)
        tmpObj.removeCallback()
      }).catch(err => {
        console.log(err)
        tmpObj.removeCallback()
      })

问题原因

Node.js环境没有原生Blob对象支持,设置responseType: "blob"会导致二进制数据在处理和传输过程中出现编码异常——XLSX本质是压缩包结构,异常数据会被识别为损坏的Zip文件。

修复方案

通过两个关键修改解决了问题:

  • 将responseType改为arraybuffer,用Node.js原生支持的二进制数据格式完整保留文件内容
  • 给响应设置正确的Content-Type头,明确告知客户端返回的是XLSX格式文件
  • 可选:如果需要触发浏览器直接下载文件,可以取消注释Content-Disposition头

修复后的代码:

axios.post(`${process.env.API_URI}`, formData, {
          headers: {
            ...formData.getHeaders(),
            'Content-Type': 'blob',
          },
          responseType:"arraybuffer"
        }).then(response => {
          // 前端可通过Buffer.from(response.data, 'base64')创建buffer

           res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
          // res.setHeader('Content-Disposition', 'attachment;filename=SheetJSNode.xlsx')
          res.status(200).send(response.data)
        }).catch(err => {
          console.log(err)
        })

内容的提问来源于stack exchange,提问作者Abdulsalam Almahdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:25:28