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

