【发布时间】:2014-12-18 21:09:00
【问题描述】:
我有以下实用程序:
// 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。我可以更改此值,但我想这是有原因的。
有人知道更好的方法吗?
【问题讨论】:
标签: javascript binary internet-explorer-9 base64 polyfills