Javascript 从文件读取器中提取部分数据';s ArrayBuffer

Javascript 从文件读取器中提取部分数据';s ArrayBuffer,javascript,html,buffer,filereader,arraybuffer,Javascript,Html,Buffer,Filereader,Arraybuffer,我正在使用该方法将文件读入内存。根据规范(如上链接): 在处理读取时,当blob中的数据可用时, 用户代理应将任务排队,以使用部分Blob更新结果 作为包含读取字节的ArrayBuffer[TypedArrays]对象的数据 直到读取完成,伴随着进程的启动 事件。获取时,result属性返回部分Blob数据 表示当前加载的字节数(作为 总的[ProgressEvents],作为ArrayBuffer[TypedArrays]对象; 用户代理必须返回至少一个这样的ArrayBuffer[Typed

我正在使用该方法将文件读入内存。根据规范(如上链接):

在处理读取时,当blob中的数据可用时, 用户代理应将任务排队,以使用部分Blob更新结果 作为包含读取字节的ArrayBuffer[TypedArrays]对象的数据 直到读取完成,伴随着进程的启动 事件。获取时,result属性返回部分Blob数据 表示当前加载的字节数(作为 总的[ProgressEvents],作为ArrayBuffer[TypedArrays]对象; 用户代理必须返回至少一个这样的ArrayBuffer[TypedArrays] 在处理此读取方法时。最后返回的值位于 完成读取

但是,在我测试过的浏览器(Firefox、Chrome和Opera)中,
reader.result
属性似乎没有得到一致的更新。例如:

var reader = new FileReader(), pos = 0;

reader.addEventListener("progress", function(event){
    console.log(reader.result);
    var content = new Uint8Array(reader.result, pos, event.loaded);
    pos = event.loaded;

    // do stuff with the content down here
});

document.getElementById("fileInput").addEventListener("change", function(event){
    reader.readAsArrayBuffer(event.target.files[0]);
});
其中有一个ID为
fileInput
且类型为
file
的HTMLInputElement。选择足够大的文件并运行回调时,控制台上会发生以下情况(此示例来自Chrome):

我认为出现TypeError是因为array视图Uint8Array无法从ArrayBuffer读取数据块,因为ArrayBuffer为null

奇怪的是,如果文件很大但不是太大,那么一些进度事件实际上会成功运行


如何可靠地实现FileReader的ArrayBuffer,以便在发生“progress”事件时为您提供所需的数据?

我想您可以在加载文件后读取ArrayBuffer。下面的函数也处理大文件。希望有帮助

function onfilechange(evt) {
var reader = new FileReader(); 
reader.onload = function(evt) {
  var chars  = new Uint8Array(evt.target.result);
  var CHUNK_SIZE = 0x8000; 
  var index = 0;
  var length = chars.length;
  var result = '';
  var slice;
  while (index < length) {
    slice = chars.subarray(index, Math.min(index + CHUNK_SIZE, length)); 
    result += String.fromCharCode.apply(null, slice);
    index += CHUNK_SIZE;
  }
  // Here you have file content as Binary String in result var
};
reader.readAsArrayBuffer(evt.target.files[0]);
}
函数onfilechange(evt){
var reader=new FileReader();
reader.onload=函数(evt){
var chars=新的Uint8Array(evt.target.result);
var CHUNK_SIZE=0x8000;
var指数=0;
变量长度=字符长度;
var结果=“”;
var切片;
while(索引<长度){
切片=字符子数组(索引,数学最小值(索引+块大小,长度));
结果+=String.fromCharCode.apply(null,切片);
索引+=块大小;
}
//在结果变量中,文件内容是二进制字符串
};
reader.readAsArrayBuffer(evt.target.files[0]);
}
function onfilechange(evt) {
var reader = new FileReader(); 
reader.onload = function(evt) {
  var chars  = new Uint8Array(evt.target.result);
  var CHUNK_SIZE = 0x8000; 
  var index = 0;
  var length = chars.length;
  var result = '';
  var slice;
  while (index < length) {
    slice = chars.subarray(index, Math.min(index + CHUNK_SIZE, length)); 
    result += String.fromCharCode.apply(null, slice);
    index += CHUNK_SIZE;
  }
  // Here you have file content as Binary String in result var
};
reader.readAsArrayBuffer(evt.target.files[0]);
}