JavaScript从Base64保存XLSX文件损坏问题求助
解决JavaScript解码Base64下载XLSX文件损坏的问题
我之前也碰到过一模一样的情况!问题出在atob()返回的是UTF-16编码的字符串,而XLSX是二进制文件,直接用字符串处理会丢失或错误转换部分字节——终端命令是直接把Base64解码成原始字节流写入文件,所以能正常打开。
要修复这个问题,你需要把atob()得到的字符串转换成原始的二进制字节数组,再用Blob来生成下载文件。具体步骤如下:
- 解码Base64字符串后,遍历每个字符获取其Unicode编码值(对应原始字节)
- 将这些值存入
Uint8Array,还原二进制数据 - 用这个数组创建Blob,再生成下载链接
下面是完整的工作代码:
// 假设你已经有validBase64Data、filename和正确的MIME类型 const base64 = validBase64Data; const filename = 'filename.xlsx'; const mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; // 正确的解码流程 const binaryString = atob(base64); const len = binaryString.length; const bytes = new Uint8Array(len); for (let i = 0; i < len; i++) { bytes[i] = binaryString.charCodeAt(i); } // 创建Blob并触发下载 const blob = new Blob([bytes], { type: mime }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); // 清理内存
为什么这个方法有效?因为Uint8Array会严格保留每个字节的原始值,而字符串会把字节当作Unicode字符处理,当字节值超出UTF-16的安全范围时就会出现损坏。用终端解码时,工具是直接把Base64转换成字节序列写入文件,和我们用Uint8Array做的事情完全一致。
你可以测试一下这段代码,应该能得到可以正常打开的XLSX文件了。
内容的提问来源于stack exchange,提问作者Lex Podgorny
相关产品推荐
相关产品推荐

