Node.js中Nodemailer发送ByteArray图片附件失败问题排查
问题原因及解决方案
你的问题出在API端点对base64字符串的解码方式错误,导致附件内容损坏,无法正常打开。
具体错误点
客户端代码中,你已将图片数据转换为base64字符串并通过JSON发送到API:
const base64Image = byteArray.toString('base64') // 将base64字符串放入payload发送
但API端点代码里,你直接用默认的utf8编码将base64字符串转成Buffer:
const byteArray = Buffer.from(request.body.image) // 错误:默认编码不匹配base64格式
这种转换会把base64字符串当作普通文本解析,生成的Buffer并非原始图片的二进制数据,最终导致附件损坏无法打开。
修复方案
修改API端点的Buffer转换代码,明确指定用base64编码解析字符串:
// 正确写法:指定base64编码解码字符串 const byteArray = Buffer.from(request.body.image, 'base64')
为什么第二种方式可行?
第二种可行的代码中,你是直接在服务器端读取本地图片文件,fs.readFile返回的data本身就是正确的二进制Buffer,不需要经过base64编码传输再解码的过程,自然不会出现编码错误,因此附件能正常打开。
额外优化建议
- 客户端代码里,
Buffer.from(data)是多余的,fs.readFile读取的data已经是Buffer类型,直接转base64即可:// 简化写法 const base64Image = data.toString('base64') - 确认API端的body解析中间件(如
body-parser.json())不会修改base64字符串内容,目前你的配置不会有这个问题。
内容的提问来源于stack exchange,提问作者Renee
相关产品推荐
相关产品推荐

