【问题标题】:base64 encode in python, decode in javascript在 python 中进行 base64 编码,在 javascript 中解码
【发布时间】:2016-05-28 08:50:01
【问题描述】:

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

【问题讨论】:

  • 这段代码看起来不错,你说的似乎是错误的是什么意思?
  • 正如我所补充的,我无法打开生成的文件(在本例中为 Excel 文件)。
  • 某些查看器打开文件时的内容是什么?文件的大小缩小了吗?
  • 文件实际上变大了,从 9kb 到 11kb。文件内容似乎是正确的内容,各种乱码穿插。我可以阅读很多文件,但里面也有很多奇怪的字符。
  • 能不能用记事本打开看看里面有没有base64的文字?我怀疑您要么不对数据进行解码,要么对其进行两次编码,因为大小的增长与您在保存之前仅对文件进行 base64 编码时一样多。

标签: javascript python json encoding


【解决方案1】:

我找到了答案here。问题出在 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'}

【讨论】:

  • developer.mozilla.org/en-US/docs/Web/API/Blob/Blob Blob 也应该接受字符串作为 Blob 部分,因此您不必将其转换为字节。喜欢new Blob([atob("AAAA")], {type:"application/octet-stream"}).size === 3
  • 你用的是什么浏览器?我刚刚在 chrome 中运行了该代码,并且可以完美运行
  • 好的,它只适用于最简单的情况。 new Blob([atob("Q9q3")], {type:"application/octet-stream"}).size === 3 确实失败了,因为它被编码为 utf8
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多