我有以下实用程序:
// 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');
我的对象的
length
为1085798
,并且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/