使用 atob() 方法时出现无效字符错误

问题描述 投票:0回答:2

我已经阅读了堆栈溢出中的一个问题,此代码在 IE 10 中工作,但在 ie9 中不起作用,

但我仍然面临着这个问题。

var image = canvas.toDataURL();
image = image.replace(/^data:[a-z]*;,/, '');
var byteString = atob(image);
var buffer = new ArrayBuffer(byteString.length);
var intArray = new Uint8Array(buffer);
for (var i = 0; i < byteString.length; i++) {
    intArray[i] = byteString.charCodeAt(i);
}
blob = new Blob([buffer], {type: "image/png"});
window.navigator.msSaveOrOpenBlob(blob, "test.png");

转换 atob(image) 时抛出异常 0x800a139e - JavaScript 运行时错误:

InvalidCharacterError
我尝试了几种方法但没有任何作用...

我在图像变量中得到了这个

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAGQCAYAAAA9XmC5AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABJFSURBVHhe7dvPa5x3fsDxeaR0l3UO9dLuSnJLE3rpzc6pp0KUQ2MLL8Xk1BZWt+7BhmKaGYctfKR3ng8vjyZTE6W5St98PZnF9ZO/NeZsiyWt0+c//RUWQBHxIkQjlBGsEx7Eb/7ZbqQF23zz22vvf+L6+f/Um4BQDeNRqPtvMoy194TQsc5EcIRatv2SZnmY9L1HOOUuDPdADpJCOEIRfQex7BaviCzkXsRxwc5At3kyzJwxMoXZmZfdLnZ7/c3yxwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvkF6vf8DAs32KwowBEUAAAAASUVORK5CYII=

请帮助我.. 预先感谢..

javascript internet-explorer-10
2个回答
7
投票

1) 您的 Base64 编码字符串可能不完全有效。您可以尝试使用此代码而不是

atob

var decodeBase64 = function(s) {
    var e={},i,b=0,c,x,l=0,a,r='',w=String.fromCharCode,L=s.length;
    var A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    for(i=0;i<64;i++){e[A.charAt(i)]=i;}
    for(x=0;x<L;x++){
        c=e[s.charAt(x)];b=(b<<6)+c;l+=6;
        while(l>=8){((a=(b>>>(l-=8))&0xff)||(x<(L-2)))&&(r+=w(a));}
    }
    return r;
};

2)我认为应该是

image = image.replace(/^[^,]+,/, '');

3)据我所知,IE从版本10开始支持

Blob
- https://developer.mozilla.org/en-US/docs/Web/API/Blob


3
投票

如果有人达到此目的并且

image = image.replace(/^[^,]+,/, '');
解决方案对他们不起作用,我在 IE11 中调用
atob
函数时会遇到相同的错误。

在我的例子中,错误是因为base64字符串每76个字符有一个回车符引起的。

这对于 Chrome 或 Firefox 来说不是问题,但 IE11 产生了

InvalidCharacterError

b64Data = b64Data.replace(/\r\n/g, '');
解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.