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

将二进制/Unicode字符串转为图片及Salesforce图片附件获取问题排查

解决Salesforce图片附件转Base64的编码问题

你这明显是被二进制数据的编码转换坑了——用btoa(unescape(encodeURIComponent(file.body)))处理图片这种二进制内容完全是错的,这套组合是用来处理UTF-8文本的,而图片是纯粹的字节流,这么转必然会破坏原始数据结构,导致生成的Base64无法还原成有效图片。

为什么你的方法无效?

encodeURIComponent会把非ASCII字符转换成%xx格式的URL编码,接着unescape会把这些编码转成UTF-8字符,但图片里的很多字节根本不是合法的UTF-8序列,这一步会直接篡改或者丢失原始字节,最后用btoa编码出来的自然是无效的Base64。

正确的处理方式,分两种情况:

情况1:库返回的file.body是ArrayBuffer

如果file.body是ArrayBuffer类型(Chrome调试器里可以看到类型标记),直接用Uint8Array遍历字节,转成二进制字符串后再Base64编码:

function arrayBufferToBase64(buffer) {
  let binaryStr = '';
  const uint8Array = new Uint8Array(buffer);
  for (let byte of uint8Array) {
    binaryStr += String.fromCharCode(byte);
  }
  return btoa(binaryStr);
}

// 使用示例
const validBase64 = arrayBufferToBase64(file.body);
// 然后可以直接用来显示图片:
// document.querySelector('img').src = `data:image/png;base64,${validBase64}`;

情况2:库返回的file.body是Blob

如果是Blob类型,用FileReader的readAsDataURL方法最方便,它会直接帮你生成带Data URI前缀的Base64字符串:

const reader = new FileReader();
reader.onload = function(e) {
  // e.target.result 就是直接可用的Data URI格式的Base64
  document.querySelector('img').src = e.target.result;
};
reader.readAsDataURL(file.body);

额外提示

先在Chrome调试器里确认file.body的具体类型(ArrayBuffer/Blob/其他),再对应选择处理方式。要是库返回的是其他格式(比如Buffer,如果你用的是Node.js环境的库),那处理逻辑会略有不同,但核心都是直接操作原始字节,别用文本编码的那套工具去碰二进制数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:18:28