我有以下实用程序:

        // Utility function to remove base64 URL prefix and store base64-encoded string in a    Uint8Array
        // Courtesy: https://gist.github.com/borismus/1032746
        function convertDataURIToBinary(dataURI) {
            var BASE64_MARKER = ';base64,';
            var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
            var base64 = dataURI.substring(base64Index);
            var raw = window.atob(base64);
            var rawLength = raw.length;
            var array = new Uint8Array(new ArrayBuffer(rawLength));

            for (i = 0; i < rawLength; i++) {
                array[i] = raw.charCodeAt(i);
            }
            return array;
        }


我这样使用:

        // Read the binary contents of the base 64 data URL into a Uint8Array
        // Append the contents of this array to the SP.FileCreationInformation
        var arr = convertDataURIToBinary(convertedDataURI);
        for (var i = 0; i < arr.length; ++i) {
            fileCreateInfo.get_content().append(arr[i]);
        }


准备文件上传。

为了使其在IE9中工作,我使用了以下polyfill:


base64-.atob
TypedArray-UInt8Array / ArrayBuffer


现在,在创建Uint8Array时会得到一个非常有用的异常:


  SCRIPT5022:引发异常且未捕获


经过一些调试后,我发现了问题:

if (obj.length > MAX_ARRAY_LENGTH) throw RangeError('Array too large for polyfill');


我的对象的length1085798,并且MAX_ARRAY_LENGTH等于100000。我可以更改此值,但我想有一个原因。

有谁知道更好的方法吗?

最佳答案

好吧,我得到了答案。

我刚设定

MAX_ARRAY_LENGTH = 2000000; //value that is higher than the expected array.length (may I should just remove the check)


结果是,浏览器由于数组大而冻结,但是在几秒钟(也许是几秒钟)后,浏览器将解冻并完成上传。

MAX_ARRAY_LENGTH用于在使用时保持一定速度。

关于javascript - IE9-DataURI到Binary-.atob,Uint8Array和ArrayBuffer的Polyfills-数组太大而无法进行polyfill,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26524026/

10-09 07:44