使用 FileReader 在浏览器中读取大文件 (web api)
Read huge files in browser using FileReader (web api)
我正在尝试读取 selected 文件的第一个字节。
但是当我 select 一个大文件 (>100Mb) 时,我得到一个错误:"NotReadableError"。
查看下面的代码。 "array buffer" 真的是一个缓冲区还是它只是将所有内容加载到内存中,我必须使用 file#slice?
function readFile(file) {
var reader = new FileReader();
reader.onload = function() {
var buffer = reader.result;
var view = new Int8Array(buffer);
try {
view.forEach(function(v, index, array) {
console.log(v);
alert("ok - " + v);
throw "BreakException";
})
} catch (e) {
if (e!=="BreakException") throw e;
}
}
reader.onerror = function() {
alert("error");
console.log(reader.error);
}
reader.readAsArrayBuffer(file);
}
var fileField = document.getElementById("file");
fileField.onchange = function(e) {
var file = e.target.files[0];
readFile(file);
}
<form>
<input id="file" type="file"/>
</form>
ArrayBuffer实际上是一个缓冲区,一个内存缓冲区。这就是缓冲区的工作原理。您的代码试图将整个文件加载到内存中。要访问文件的特定范围而不将整个文件加载到内存中,您必须使用 Blob.slice(文件实现 Blob 的所有方法),正如您所怀疑的那样。
我正在尝试读取 selected 文件的第一个字节。
但是当我 select 一个大文件 (>100Mb) 时,我得到一个错误:"NotReadableError"。
查看下面的代码。 "array buffer" 真的是一个缓冲区还是它只是将所有内容加载到内存中,我必须使用 file#slice?
function readFile(file) {
var reader = new FileReader();
reader.onload = function() {
var buffer = reader.result;
var view = new Int8Array(buffer);
try {
view.forEach(function(v, index, array) {
console.log(v);
alert("ok - " + v);
throw "BreakException";
})
} catch (e) {
if (e!=="BreakException") throw e;
}
}
reader.onerror = function() {
alert("error");
console.log(reader.error);
}
reader.readAsArrayBuffer(file);
}
var fileField = document.getElementById("file");
fileField.onchange = function(e) {
var file = e.target.files[0];
readFile(file);
}
<form>
<input id="file" type="file"/>
</form>
ArrayBuffer实际上是一个缓冲区,一个内存缓冲区。这就是缓冲区的工作原理。您的代码试图将整个文件加载到内存中。要访问文件的特定范围而不将整个文件加载到内存中,您必须使用 Blob.slice(文件实现 Blob 的所有方法),正如您所怀疑的那样。