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

NodeJS调用API获取PNG响应,如何本地保存及转Base64?

解决Node.js中保存API返回的PNG图片到本地的问题

嘿,我明白你的困扰了——你拿到的是PNG的二进制数据,直接当字符串处理肯定会乱码,而且window.btoa是浏览器端的API,Node.js里根本用不了,这就是你失败的原因。下面给你两种可行的方案:

方案一:直接将二进制响应保存为本地文件(最推荐)

Node.js中,当你请求图片这类二进制资源时,响应会以Buffer对象的形式返回,你可以直接用fs模块把它写入本地文件,完全不需要转Base64:

用axios的实现例子:

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

async function saveImage() {
  try {
    // 发送GET请求,指定响应类型为二进制arraybuffer
    const response = await axios.get('/server/dab.png', {
      responseType: 'arraybuffer'
    });
    // 将Buffer直接写入本地文件
    fs.writeFileSync('./dab.png', response.data);
    console.log('图片保存成功!');
  } catch (error) {
    console.error('保存失败:', error);
  }
}

saveImage();

用Node.js原生http模块的实现例子:

const http = require('http');
const fs = require('fs');
const fileStream = fs.createWriteStream('./dab.png');

http.get('http://your-api-server/server/dab.png', (response) => {
  // 直接将响应流管道到文件流,高效处理大文件
  response.pipe(fileStream);
  fileStream.on('finish', () => {
    fileStream.close();
    console.log('图片保存完成!');
  });
}).on('error', (err) => {
  fs.unlink('./dab.png', () => {}); // 删除未完成的残缺文件
  console.error('请求出错:', err);
});

方案二:将二进制响应转为Base64后保存(适配需要Base64的场景)

如果你确实需要先转成Base64字符串再处理,Node.js的Buffer对象自带toString('base64')方法,直接用就行:

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

async function convertAndSave() {
  try {
    const response = await axios.get('/server/dab.png', {
      responseType: 'arraybuffer'
    });
    // 将二进制Buffer转成Base64字符串
    const base64Str = Buffer.from(response.data).toString('base64');
    // 保存Base64字符串到文本文件
    fs.writeFileSync('./dab-base64.txt', base64Str);
    // 或者从Base64转回图片格式保存
    fs.writeFileSync('./dab-from-base64.png', Buffer.from(base64Str, 'base64'));
    console.log('Base64转换及保存完成!');
  } catch (error) {
    console.error('处理失败:', error);
  }
}

convertAndSave();

关键注意点:

  • 一定要设置请求的responseType为arraybuffer,这样请求库会把响应解析成二进制Buffer,而不是默认的字符串,从根源避免乱码问题。
  • 彻底忘记window.btoa吧!Node.js里处理二进制数据用Buffer才是正确姿势,它专门用来处理字节流,不会出现编码错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:33:43