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

Node.js图片转Base64结果异常,与在线工具不符求助

问题分析与解决方案

我一眼就看出问题出在request-promise的默认配置上!你忽略了一个关键细节:request-promise默认会把响应内容当作UTF-8字符串来解析,但图片是二进制数据,这种解析方式会直接破坏原始的字节信息,导致后续转Base64时出现错误。

为什么会出现差异?

当你用Postman测试时,它会直接处理二进制响应,不会做字符串转换;在线工具也是直接读取图片的原始二进制数据来生成Base64。但你的Node.js代码里,rp(options)返回的已经是被转成UTF-8字符串的“损坏”数据,再用Buffer.from(image, 'binary')去还原,自然得不到正确的结果,这就是两个Base64字符串不一样的原因。

修复步骤

1. 修改queryViewImage的请求配置

在请求选项里添加encoding: null,告诉request-promise不要解析响应,直接返回原始的二进制Buffer:

const queryViewImage = (token, siteId, viewId) => {
 const options = {
 method: 'GET',
 url: `${url('sites')}/${siteId}/views/${viewId}/image`,
 headers: { 'X-Tableau-Auth': token },
 encoding: null // 关键配置:返回原始Buffer
 };
 return rp(options)
 .then((response) => response)
 .catch((err) => err);
}

2. 简化Base64转换代码

因为现在rp返回的直接是Buffer对象,你不需要再用Buffer.from去转换,直接调用toString('base64')即可:

app.get('/image', (req, res) => { 
 ServerAPI.queryViewImage(options).then(image => { 
  res.render('image', { image: image.toString('base64') }); 
 }); 
});

验证效果

这样修改后,Node.js生成的Base64字符串就会和在线工具的结果完全一致,渲染到HTML的img标签里也能正常显示图片了。

内容的提问来源于stack exchange,提问作者Rafał Bagrowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:42:44