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
相关产品推荐
相关产品推荐

