【问题标题】:Read part of binary file in javascript without loading whole file in memory在javascript中读取部分二进制文件而不将整个文件加载到内存中
【发布时间】:2020-05-24 07:01:31
【问题描述】:

我需要在 javascript 中读取一个非常大的本地二进制文件(在浏览器中,而不是节点中)。该文件包含一个标头,其中包含我将使用的数据块的偏移量和大小。由于它是一个大文件,我不想将它全部加载到内存中。我想读取标题,然后只读取我将使用的数据块(不是全部)。

在 C/C++ 中,我可以将自己定位在文件的某个偏移量中,而无需实际读取整个文件,但我无法从浏览器(而不是节点)中找到执行此操作的方法。 javascript 中的 FileReader 对象在返回数组缓冲区之前读取整个参数。我找不到更好的方法来做到这一点。

【问题讨论】:

    标签: javascript filereader


    【解决方案1】:

    您可以使用 File API 按切片读取文件:

    var blob = file.slice(startingByte, endingByte);

    检查:https://developer.mozilla.org/en-US/docs/Web/API/Blob/slice

    【讨论】:

      【解决方案2】:

      即使 Pablo CG 的答案是正确的,我还是决定用一个例子来扩展它。基本上我花了一点时间来理解如何实现它,所以将来其他人可能会遇到同样的情况。

      基本上,您只需按切片读取文件(如 Pablo 建议的那样),然后然后将其传递给 fileReader(这是我花了一些时间才弄清楚的部分):

      window.onload = function() {
      
          if (window.File && window.FileReader) {
            // Great success! All the File APIs are supported.
          } else {
            alert('The File APIs are not fully supported in this browser.');
          }
      
          function handleFileSelect(evt)
          {
              var file = evt.target.files[0];
      
              if (file != undefined);
              {
                  let reader = new FileReader();
                  let blob = file.slice(0, 2);
      
                  reader.onload = function(e) {
                      var buffer = e.target.result;
                      let dv = new DataView(buffer);
                      let blockId = dv.getUint16(0,true);
      
                      if (blockId.toString(16)!="3a55"){
                          throw "Wrong format. Not a SEG-2 file."; }
                  }
                  reader.readAsArrayBuffer(blob);
              }
          }
      
          document.getElementById('fileInput').addEventListener('change', handleFileSelect);
      }
      

      在示例中,我只读取二进制文件的前两个字节以确定它是否确实是我正在处理的文件类型。

      【讨论】:

        猜你喜欢
        • 2010-11-21
        • 1970-01-01
        • 2017-08-08
        • 2020-06-13
        • 2014-10-22
        • 2017-06-16
        • 2013-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多