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

Node.js使用fs保存API返回PDF无法打开的问题排查

问题分析与解决

乱码类型说明

你看到的乱码是二进制数据被错误当作文本编码(默认UTF-8)解析导致的。PDF属于二进制文件,除了开头的%PDF-1.6这类可打印文本标识,其余内容包含大量非文本字节(比如字体、图像的二进制数据)。Axios默认会把响应按文本方式处理,将这些二进制字节强行转成UTF-8字符串,无法解析的字节就会变成乱码,同时原始二进制信息也会丢失。

操作错误与修复方案

你的核心问题是没有正确处理二进制响应数据,具体问题和解决方法如下:

  1. Axios请求未配置响应类型
    默认情况下Axios会把响应解析为UTF-8字符串,这会破坏PDF的二进制结构。必须在请求时指定responseType: 'arraybuffer',让Axios保留原始二进制数据(Node.js环境下会返回Buffer类型)。

  2. 文件写入时错误使用文本编码
    之前用writeFile/writeFileSync时如果没指定编码,默认会按UTF-8写入字符串,进一步损坏数据。正确做法是直接写入Buffer类型的原始响应数据,不需要指定编码。

正确代码示例

const axios = require('axios');
const fs = require('fs');

axios.get('你的API接口地址', {
  responseType: 'arraybuffer' // 关键配置,保留二进制数据
})
.then(response => {
  // 直接写入Buffer,无需指定编码
  fs.writeFileSync('result.pdf', response.data);
  console.log('PDF文件保存成功');
})
.catch(error => {
  console.error('请求或保存失败:', error);
});

为什么存为txt再改后缀无效?

你存为txt时能看到%PDF-1.6,是因为这几个字符的二进制值刚好能被UTF-8正确解析,但后续的二进制数据转成字符串时已经被破坏,再写入文件时,字符串的编码转换已经改变了原始PDF的二进制结构,所以即使改回PDF后缀,阅读器也无法识别完整的PDF格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:40:35