将数组缓冲区转换为字符串 - 最大调用堆栈大小超过

时间:2018-03-06 04:07:15

标签: javascript binary

我们的应用程序下载了一个zip文件,但响应是二进制文件。

所以我做的是将它转换为base64。它在大小为87.7KB时有效,但在响应大小为183KB时发生错误。

错误为Uncaught RangeError: Maximum call stack size exceeded

有问题的行是

btoa(String.fromCharCode.apply(null, new Uint8Array(blob)))

根据this answerString.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

的最顶部片段再次更改了它

现在新代码

btoa(unescape(encodeURIComponent(new TextDecoder('utf-8').decode(new Uint8Array(blob)))))

现在可以下载,但下载的zip文件已损坏。

可以看到整个代码here

2 个答案:

答案 0 :(得分:14)

我从另一个问题得到了答案

To get latest post with url:
<?php
        $args = array( 'numberposts' => '1', 'category' => CAT_ID );
        $recent_posts = wp_get_recent_posts( $args );
        foreach( $recent_posts as $recent ){
        echo '<a href="' . get_permalink($recent["ID"]) . '">Latest Post</a>';`enter code here`
        }
    ?>
Hope this helps .

ASCII table

答案 1 :(得分:0)

https://stackoverflow.com/a/40077712/6582356

function blobToB64(data) {
    if ('TextDecoder' in window) {
      // Decode as UTF-8
      var dataView = new DataView(data);
      var decoder = new TextDecoder('utf8');
      return btoa(decoder.decode(dataView));
    } else {
      // Fallback
      return btoa(new Uint8Array(data).reduce((data, byte) =>
        data + String.fromCharCode(byte),
        ''))
    }
}

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

这似乎有更好的表现