首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定最后一个文件块

确定最后一个文件块
EN

Stack Overflow用户
提问于 2016-09-04 00:16:07
回答 2查看 865关注 0票数 2

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

现在,我只能确定blob何时为空,但我无法确定在blob为空之前如何确定最后一次迭代。

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

代码语言:javascript
复制
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);
}

科德芬

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-04 00:41:53

为什么不依赖文件大小,即检查条件_chunkSize + _offset >= fileSize

票数 0
EN

Stack Overflow用户

发布于 2016-09-04 02:54:38

您可以使用progressloadend事件一次处理File对象一个字节;定义一个变量,在该变量中,处理应该在n字节、每n字节或任何字节处理文件时暂停或停止。

代码语言:javascript
复制
var str = "abcdefghijklmnopqrstuvwxyz";
var type = "application/octet-stream";
var data = new Blob([], {
  type: type
});
var filename = "file.txt";
var reader = new FileReader();
var complete = false;
var beforeEnd = false;
var stopAt = str.length - 1;

function handleFile(e) {
  data = new File([data.slice()
                   , str.slice(data.size, data.size + 1)]
                   , filename, {
                       type: type,
                       lastModifiedDate: new Date()
          });
}

function handleRead(e) {
  if (data.size <= str.length && !complete) {
    if (data.size === stopAt && !beforeEnd) {
      beforeEnd = true;
      var r = new FileReader();
      r.onloadend = function() {            
        alert(`stopAt: ${stopAt}\n`
              +`data.size: ${data.size}\n`
              +`result at stopAt: ${r.result[stopAt -1]}`);
        reader.readAsArrayBuffer(data);
      }
      r.readAsText(data);
    } else {
      reader.readAsArrayBuffer(data)
    }
  } else {
    console.log("complete")
  }
}

function handleProgress(e) {
  if (data.size <= str.length && !complete) {
    var read = new FileReader();
    read.onload = function() {
      if (!complete) {
        console.log(read.result);
        if (read.result.length === str.length) {
          complete = true;
          console.log(data);
        }
      }
    }
    read.readAsText(data);
  }
}

reader.addEventListener("load", handleFile);

reader.addEventListener("loadend", handleRead);

reader.addEventListener("progress", handleProgress);

reader.readAsArrayBuffer(data);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39312451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档