【发布时间】:2016-05-20 17:36:12
【问题描述】:
我想上传大文件,使用 Uint8Array 和 slice() 函数。 需要 slice(),因为大文件也需要处理。
var fileReader = new FileReader();
fileReader.onloadend = function(event) {
var contents = new Uint8Array(event.target.result);
var bufferSize = 8192;
var byteBuffer = [];
var temp = null;
var pos = 0;
for(var i = 0; i < contents.length; i+=bufferSize) {
pos = contents.length > i+bufferSize ? i+bufferSize : contents.length;
byteBuffer.push(String.fromCharCode.apply(null, contents.slice(i, pos)));
}
var bytes = byteBuffer.join('');
contents = undefined;
byteBuffer = undefined;
var formData = new FormData();
formData.append('name', 'somefile.dat');
formData.append('data', bytes);
// do the POST formData
};
以上代码仅适用于 Firefox。
所有浏览器都支持 Uint8Array: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array
问题是Uint8Array继承自TypedArray,上面的代码使用了TypedArray.prototype.slice()函数。仅 Firefox 支持:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice
还有一个 subarray() 函数,但这不会创建浅拷贝。在处理大文件时,创建深拷贝并不是一个好主意。
我也查看了 lodash 的 slice(),但它是针对 Array 而不是 TypedArray。所以这对我不起作用。
也许我应该编写一个函数来创建子数组的浅拷贝?
【问题讨论】:
-
我不认为
subarray()做一个深拷贝,我认为它只是在同一个缓冲区上创建一个新的Uint8Array视图。 -
这是真的。
subarray()与slice()一样快。谢谢
标签: javascript arrays google-chrome file-upload slice