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