【问题标题】:window.atob fails to decode string and throws an errorwindow.atob 无法解码字符串并抛出错误
【发布时间】:2019-03-26 13:28:23
【问题描述】:
        function saveIMG(image) {
            var startIndex = image.indexOf("base64,") + 7;
            var b64 = image.substr(startIndex, image.indexOf(">") - startIndex - 2);
            var byteCharacters = atob(b64);
            var byteNumbers = new Array(byteCharacters.length);
            for (var i = 0; i < byteCharacters.length; i++) {
                byteNumbers[i] = byteCharacters.charCodeAt(i);
            }
            var byteArray = new Uint8Array(byteNumbers);
            var data = new Blob([byteArray], {type: 'image/jpeg'});
            return "<img src='" + window.URL.createObjectURL(data) + "' width='150'/>";
        }

我想使用此代码将 base64 图像编码为使用 URL 的图像。但是,在它使用 atob 的那一行会抛出这个错误:

Uncaught DOMException: Failed to execute 'atob' on 'Window': 要解码的字符串编码不正确。

我只能假设它与 base64 有关,或者它可能无法使用 atob 转换 base64 图像。无论如何,这是从子字符串中获取的 base64 的开头:

/9j/4AAQSkZJRgABAQEASABIAAD/7RTuUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAA8cAVoAAxslRxwCAAACAAAAOEJJTQQlAAAAAAAQzc/6fajHvgkFcHaurwXDTjhCSU0EOgAAAAAA5QAAABAAAAABAAAAAAALcHJpbnRPdXRwdXQAAAAFAAAAAFBzdFNib29sAQAAAABJbnRlZW51bQAAAABJbnRlAAAAAENscm0AAAAPcHJpbnRTaXh0ZWVuQml0Ym9vbAAA

【问题讨论】:

  • 你从哪里得到这个image.indexOf('&gt;')

标签: javascript arrays base64 blob


【解决方案1】:

从这里我想说你的问题在于 substr 第二个参数:

 image.indexOf(">") - startIndex - 2

虽然您的其余代码指向正常的 dataURI,但这部分意味着存在一个在那里无效的字符 (&gt;)。

所以我强烈怀疑第二个参数的值是-1 -16 -2 => -19,因此可能会删除太多数据,这会使你的 base64 字符串无效(例如,如果它的长度 / 4 留下 1 个余数)。

所以如果你真的有一个有效的 dataURI,那么你只需要删除第二个参数:

function saveIMG(image) {
var startIndex = image.indexOf("base64,") + 7;
var b64 = image.substr(startIndex);
var byteCharacters = atob(b64);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var data = new Blob([byteArray], {type: 'image/jpeg'});
return "<img src='" + window.URL.createObjectURL(data) + "' width='150'/>";
}

// a black 300x150px JPEG image
var dataURI = document.createElement('canvas').toDataURL('image/jpeg');
var imgStr = saveIMG(dataURI);
document.body.innerHTML = imgStr;

【讨论】:

  • 糟糕,是的,我忘记删除了,谢谢!多么愚蠢的错误!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多