1

我正在使用对 perl 脚本的 JAX 调用,该脚本返回 pdf 的 base64,但它在 IE 中给我带来了麻烦。最终我想解码 base64 数据并创建一个用于 PDFJS 的 blob。它使用以下代码在 chrome/firefox 中工作:

$.ajax({
    url: '/path/to/my.cgi',
    type: "POST",
    data: opts,
    async: false,
    success: function(data){
        var byteChars = atob(data);
        var byteNumbers = new Array(byteChars.length);
        for (var i = 0; i < byteChars.length; i++){
            byteNumbers[i] = byteChars.charCodeAt(i);
        }
        var byteArray = new Uint8Array(byteNumbers);
        var blob = new Blob([byteArray], {type: "application/pdf;base64" });
        var url = URL.createObjectURL(blob);
    }
});

然而,它永远不会过去 var byteChars = atob(data)。我的印象是它应该在 >IE10 中工作,但我只是继续前进并决定尝试这个问题的代码。由于某种原因,它正在用一些中文/普通话字符解码base64。下面分别是 IE11 和 chrome 的结果:

IE 铬合金

我已经从其他位置尝试过 base64 脚本,例如this,但在 IE 中的结果总是相同的。这不允许 PDFJS 正确加载 blob。

如果有人能提供一些启示,我将不胜感激。这是我拥有的最新代码:

$.ajax({
    ...
    success: function(data){
        var userAgent = navigator.userAgent || navigator.vendor || window.opera;
        var byteChars;
        if(userAgent.indexOf("MSIE ") > 0 || !!navigator.userAgent.match(/Trident/)){
            // You can use either link I provided for this Base64.decode()
            byteChars = Base64.decode(data); 
        } else {
            byteChars = atob(data);
        }
        var byteNumbers = new Array(byteChars.length);
        for (var i = 0; i < byteChars.length; i++){
            byteNumbers[i] = byteChars.charCodeAt(i);
        }
        var byteArray = new Uint8Array(byteNumbers);
        var blob = new Blob([byteArray], {type: "application/pdf;base64" });
        var url = URL.createObjectURL(blob);
    }
});
4

1 回答 1

0

好的,由于某种原因,我在使用 base64 库时遇到了问题。所以,我只是用下面的函数只替换了 atob,它在 IE、iOS、Firefox、Chrome、Android 和 Edge 中都能完美运行。

var atob = function(input){
    var str = String(input).replace(/=+$/, '');
    for (
         // initialize result and counters
         var bc = 0, bs, buffer, idx = 0, output = '';
         // get next character
         buffer = str.charAt(idx++);
         // character found in table? initialize bit storage and add its ascii value;
         ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
                     // and if not first of each 4 characters,
                     // convert the first 8 bits to one ascii character
                     bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
     ) {
         // try to find character in table (0-63, not found => -1)
         buffer = chars.indexOf(buffer);
    }
    return output;
}
于 2015-08-26T20:46:00.663 回答