Node.js中含特殊字符的HTML转Base64出现乱码的解决方法
解决HTML文件转Base64时的乱码问题
问题根源
你当前的代码存在两个关键问题:
- 错误地将文件路径字符串而非文件实际内容转成了Base64(从代码
new Buffer.from(req.file.path, 'utf8')可以看出,req.file.path是文件的路径字符串,不是文件的二进制内容); - 即使读取了文件内容,若先以
utf8编码转换为字符串再生成Buffer,会破坏原始二进制结构——特殊字符或非utf8兼容字节会被替换为�,最终导致Base64转回HTML时乱码。
在线工具之所以能正确处理,是因为它直接基于文件的原始二进制数据进行Base64编码,没有经过字符串编码的中间环节。
正确实现方式
根据你的文件获取方式,选择以下对应方案:
方案1:通过文件路径读取文件(使用fs模块)
直接读取文件的二进制数据,无需指定编码,再转Base64:
const fs = require('fs'); // 读取文件原始二进制内容 const fileBuffer = fs.readFileSync(req.file.path); // 转换为Base64字符串 const base64File = fileBuffer.toString('base64');
方案2:使用上传中间件(如multer)的内置buffer
若你用multer等工具处理文件上传,req.file.buffer已经是文件的原始二进制Buffer,直接转Base64即可:
const base64File = req.file.buffer.toString('base64');
核心原理
Base64是对二进制数据的编码格式,必须基于文件的原始字节流处理。任何先将二进制转成带编码的字符串的操作,都会破坏原始字节结构,导致特殊字符、非utf8编码内容丢失或损坏。直接使用二进制Buffer转Base64,才能保证编码后的字符串可以完整还原为原始HTML文件。
内容的提问来源于stack exchange,提问作者Việt Hoàng
相关产品推荐
相关产品推荐

