html5 fileReader -- 如何只读取文件的前N个字符?

问题描述 投票:0回答:2

目前我使用如下模式来读取一系列文件的前 3 个字符:

var files = e.dataTransfer.files;
for (var i = 0, f; f = files[i]; i++) {
  var fr = new FileReader();
  fr.onload = function(e) { 
    var first_three_chars = e.target.result.substr(0,3);
  }
  fr.readAsText(f);
}

问题是我只对文件的前3个字符感兴趣,而这种方法会读取整个文件,浪费大量内存和时间。如何快速迭代文件,只需快速浏览第一个字符?

编辑:slice() 就是答案,谢谢 sshen。我是这样做的:

var files = e.dataTransfer.files;
for (var i = 0, f; f = files[i]; i++) {
  var fr = new FileReader();
   fr.onloadend = function(e) {
    if (e.target.readyState == FileReader.DONE) {
      var first_three_chars = e.target.result;
    }
  };
  var blob = f.slice(0, 3);
  fr.readAsText(blob);
}
javascript html filereader
2个回答
24
投票

您可以使用

.slice
方法。您可以阅读更多这里

var reader = new FileReader();

reader.onloadend = function(evt) 
{
    if (evt.target.readyState == FileReader.DONE)  // DONE == 2
    {
        alert(evt.target.result);
    }
};

var blob = file.slice(start, stop + 1);
reader.readAsBinaryString(blob);

2
投票

没有足够的代表发表评论,所以在这里提出一些关于 @Stu Blair 解决方案的警告: 使用

Blob.slice
方法,您将从 Blob 中获取 bytes,而不是 characters

例如,这是行不通的:

const blob = new Blob(['😀'], {type: 'text/plain'});
const fr = new FileReader();
fr.readAsText(blob); // Fine, fr.result will be '😀'
fr.readAsText(blob.slice(0, 2)); // Not good, fr.result will be '��'

您必须使用

FileReader.readAsArrayBuffer
来获取字节。如果您的编码类似于 utf-8,您将必须从头开始阅读。

© www.soinside.com 2019 - 2024. All rights reserved.