base64用python编码,用javascript解码

base64用python编码,用javascript解码,javascript,python,json,encoding,Javascript,Python,Json,Encoding,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 = res

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'),但这没有什么区别。我的代码有问题吗?

我找到了答案。问题出在JavaScript方面。似乎仅将
atob
应用于base64编码字符串不适用于二进制数据。您必须将其转换为类型化字节数组。我最终做了什么(LiveScript):


这段代码看起来不错,你说的似乎有错是什么意思?正如我添加的,我无法打开生成的文件(在本例中是Excel文件)。当某些查看器打开文件时,文件的内容是什么?文件的大小缩小了吗?文件实际上变大了,从9kb到11KB。文件内容似乎是正确的,到处都是胡言乱语。我可以读很多文件,但里面也有很多奇怪的字符。你能用记事本打开它,看看里面是否有base64文本吗?我怀疑您要么没有对数据进行解码,要么对其进行两次编码,因为数据大小的增长与您在保存之前对文件进行base64编码的情况一样大。blob也应该接受字符串作为blob的一部分,所以您不必将其转换为字节。比如
newblob([atob(“AAAA”)],{type:“application/octet stream”})。size==3
您使用的浏览器是什么?我只是在chrome上运行了这段代码,它运行得非常完美,它只在最简单的情况下运行<代码>新Blob([atob(“Q9q3”)],{type:“application/octet stream”})。大小===3确实会失败,因为它被编码为utf8
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'}