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

