在Python中进行Base64编码,在JavaScript中进行解码

6

Python后端读取二进制文件,对其进行base64编码,将其插入到JSON文档中,并将其发送到JavaScript前端:

#Python
with open('some_binary_file', 'rb') as in_file:
    return base64.b64encode(in_file.read()).decode('utf-8')

JavaScript前端从JSON文档中获取base64编码字符串,并将其转换为二进制blob:
#JavaScript
b64_string = response['b64_string'];
decoded_file = atob(b64_string);
blob = new Blob([decoded_file], {type: 'application/octet-stream'});

很不幸,在下载blob时,编码似乎出现了问题,但我不确定问题出在哪里。例如,这是一个Excel文件,我无法再打开它。在Python部分中,我尝试了不同的解码器(“ascii”,“latin1”),但没有任何区别。我的代码有问题吗?


这段代码看起来很好,你所说的“似乎有问题”是什么意思? - Tamas Hegedus
我添加了代码后无法打开生成的文件(在这种情况下是一个Excel文件)。 - Berco Beute
文件实际上变大了,从9kb到11kb。文件内容似乎是正确的内容,但夹杂着各种无意义的字符。我可以读取很多文件内容,但也有很多奇怪的字符。 - Berco Beute
完整的源代码有点复杂,但除了我问题中提到的这两个片段外,其它并没有什么值得关注的地方。由于 Python 和 JavaScript 端的 base64 字符串是相同的,你认为错误可能出现在哪一边? - Berco Beute
我真的不知道... 我会从 JavaScript 部分开始,因为在 JS 中容易犯错。 - Tamas Hegedus
显示剩余4条评论
1个回答

1
我在这里找到了答案。问题出在JavaScript方面。似乎仅将atob应用于Base64编码的字符串对于二进制数据是不起作用的。你需要将其转换为类型化的字节数组。最终我所做的(LiveScript):
byte_chars = atob base64_str
byte_numbers = [byte_chars.charCodeAt(index) for bc, index in byte_chars]
byte_array = new Uint8Array byte_numbers
blob = new Blob [byte_array], {type: 'application/octet-stream'}

Blobs应该也接受字符串作为blob部分,因此您不必将其转换为字节。例如 new Blob([atob("AAAA")], {type:"application/octet-stream"}).size === 3 - Tamas Hegedus
你用的是什么浏览器?我刚在Chrome中运行了那段代码,完美无缺。 - Tamas Hegedus
好的,它只在最简单的情况下起作用。实际上new Blob([atob("Q9q3")], {type:"application/octet-stream"}).size === 3会失败,因为它被编码为utf8。 - Tamas Hegedus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接