【发布时间】:2018-08-13 20:40:40
【问题描述】:
我们的应用下载了一个 zip 文件,但响应是二进制的。
所以我所做的就是将其转换为 base64。大小为87.7KB时有效,但响应大小为183KB时出错。
错误是Uncaught RangeError: Maximum call stack size exceeded
有问题的行是
btoa(String.fromCharCode.apply(null, new Uint8Array(blob)))
根据this answer,String.fromCharCode.apply()必须替换为TextEncoder。
所以我改成
btoa(new TextDecoder('utf-8').decode(new Uint8Array(blob)))
但我得到一个错误。
Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
我用这个answer最上面的sn-p再次改变了它
现在是新代码
btoa(unescape(encodeURIComponent(new TextDecoder('utf-8').decode(new Uint8Array(blob)))))
现在可以下载,但下载的 zip 文件已损坏。
完整代码可见here
【问题讨论】:
-
我已经对你之前的回答发表了评论,但这是一个X-Y问题,你真的不需要通过b64,甚至不需要通过AB。
标签: javascript binary