尝试在已用 Java 编码的 JS 中解码 Base64 时出现“要解码的字符串未正确编码”错误
Posted
技术标签:
【中文标题】尝试在已用 Java 编码的 JS 中解码 Base64 时出现“要解码的字符串未正确编码”错误【英文标题】:"The string to be decoded is not correctly encoded " error when trying to decode Base64 in JS which has been encoded in Java 【发布时间】:2019-05-21 11:54:22 【问题描述】:我在尝试将一些数据从 Java 传递到 JS 时遇到问题。
原始数据的类型为byte[]
。
在我使用的 Java 端:
byte[] data = some_data;
return Base64.getEncoder().withoutPadding().encodeToString(data)
在我尝试使用的 JS 方面:
atob(b64Data)
当我这样做时,我遇到了该主题的错误:
DOMException: 无法在 'Window' 上执行 'atob': 字符串 解码未正确编码。
注意:删除 .withoutPadding()
会产生相同的结果。
我的问题是,如何返工代码让错误不再出现?
【问题讨论】:
你的问题是什么? 你在 javascript 中的b64Data
是什么?当你打印/记录它时你看到了什么?你是怎么收到的?
编码问题?
我正在使用 SockJS 通过 WebSocket 上的 STOMP 发送数据。该数据是具有超过 40M 个字符的 excel 文件的二进制文件。我可以尝试查看文件的开头是否显示了某些内容,但我认为这些数据应该从 Java 服务器“按原样”发送。
你能不能同时编码简单的字符串?您的代码看起来正确,所以问题可能出在数据中(太长)
【参考方案1】:
看来问题出在 Spring 端通过 WebSocket/SockJS 的 STOMP 客户端,而不是编码数据本身。
虽然数据是从带有签名的方法发送的
public String getDataForExcelFile
通过 WebSocket 得到的结果如下所示:
FrameImpl command, headers, ack, binaryBody, body, (...)
所以而不是
atob(b64Data)
我需要使用atob(b64Data.body)
。
【讨论】:
以上是关于尝试在已用 Java 编码的 JS 中解码 Base64 时出现“要解码的字符串未正确编码”错误的主要内容,如果未能解决你的问题,请参考以下文章