Javascript 确定最后一个文件块

Javascript 确定最后一个文件块,javascript,arrays,slice,filereader,Javascript,Arrays,Slice,Filereader,我正在尝试通过rest为大文件设置文件上载。下面的函数负责分块,但我需要能够识别最后一个分块,因为我的rest调用更改为/finishUpload(),以便提交保存 现在我只能知道blob什么时候是空的,但是我不知道如何确定blob为空之前的最后一次迭代 下面是我用来解析文件的脚本 export default function parseFile(file, options) { var opts = typeof options === 'undefined' ? {} :

我正在尝试通过rest为大文件设置文件上载。下面的函数负责分块,但我需要能够识别最后一个分块,因为我的rest调用更改为
/finishUpload()
,以便提交保存

现在我只能知道blob什么时候是空的,但是我不知道如何确定blob为空之前的最后一次迭代

下面是我用来解析文件的脚本

export default function parseFile(file, options) {
  var opts       = typeof options === 'undefined' ? {} : options;
  var fileSize   = file.size;
  var chunkSize  = typeof opts['chunk_size'] === 'undefined' ?  64 * 1024 : parseInt(opts['chunk_size']);
  var binary     = typeof opts['binary'] === 'undefined' ? false : opts['binary'] == true;
  var offset     = 0;
  var self       = this; // we need a reference to the current object
  var readBlock  = null;
  var chunkReadCallback = typeof opts['chunk_read_callback'] === 'function' ? opts['chunk_read_callback'] : function() {};
  var chunkErrorCallback = typeof opts['error_callback'] === 'function' ? opts['error_callback'] : function() {};
  var success = typeof opts['success'] === 'function' ? opts['success'] : function() {};

  var onLoadHandler = function(evt) {
    if (evt.target.result == "") {
      console.log('Chunk empty, call finish');
      success(file);
      return;
    }

    if (evt.target.error == null) {
      chunkReadCallback(evt.target.result, offset).then(function() {
        offset += evt.target.result.length;
        readBlock(offset, chunkSize, file);
      });
    } else {
      chunkErrorCallback(evt.target.error);
      return;
    }
    if (offset >= fileSize) {
      success(file);
      return;
    }
  }

  readBlock = function(_offset, _chunkSize, _file) {
    var r = new FileReader();
    var blob = _file.slice(_offset, _chunkSize + _offset);
    console.log("blob size:", blob.size, "offset:", _offset, "C+S:",_chunkSize + _offset)
    r.onload = onLoadHandler;

    if (binary) {
      r.readAsArrayBuffer(blob);
    } else {
      r.readAsText(blob);
    }
  }
  readBlock(offset, chunkSize, file);
}

为什么不依赖文件大小,即检查条件
\u chunkSize+\u offset>=filesize

您可以使用
进度
加载端
事件一次处理
文件
对象一个字节;定义一个变量,在该变量中,在文件处理过程中,应在第n个字节、每第n个字节或任何字节暂停或停止处理

var str=“abcdefghijklmnopqrstuvxyz”;
var type=“应用程序/八位字节流”;
var数据=新的Blob([]{
类型:类型
});
var filename=“file.txt”;
var reader=new FileReader();
var complete=false;
var beforeEnd=假;
var stopAt=str.length-1;
函数句柄文件(e){
数据=新文件([data.slice())
,str.slice(data.size,data.size+1)]
,文件名{
类型:类型,
lastModifiedDate:新日期()
});
}
功能手柄(e){

如果(data.size)不确定原因,但始终返回true。如果您知道文件大小(使用
blob.size
)和最后一个块的大小,则可以先读取最后一个块以获取所需的数据,然后继续当前的操作。