FileReader.onprogress块大小

时间:2014-01-15 03:50:26

标签: javascript html5

您的浏览器如何决定触发FileReader.onprogress事件的频率?我正在对这个事件进行一些处理,我认为它更频繁地发射我想要的。我想要更大的块。有没有办法告诉它不经常发射?

示例代码:

_.each(dropEvent.originalEvent.dataTransfer.files, function(file) {
    var reader = new FileReader();
    var pos = 0;
    var startTime = +new Date();
    var xxh = XXH();

    reader.onprogress = function(progress) {
        var length = progress.loaded - pos;
        var arr = new Uint8Array(reader.result, pos, length);
        pos += length;

        xxh.update(arr);

        if (progress.lengthComputable) {
            console.log('hashing', (progress.loaded / progress.total * 100).toFixed(1) + '%');
        }
    };

    reader.onload = function() {
        var arr = new Uint8Array(reader.result, pos);
        xxh.update(arr);
        var hash = xxh.digest().toNumber();

        var elapsed = +new Date() - startTime;
        console.info("computed hash", xxh.digest().toNumber(), 'for file', file.name, 'in', elapsed, 'ms');
    };

    reader.readAsArrayBuffer(file);
});

1 个答案:

答案 0 :(得分:4)

在调查另一个问题时,我碰巧遇到了这个老问题 您可能不再需要解决方案,但这可能有助于未来的访问者。


您应该将文件切片为较小的Blob,以便指定所需的确切大小。

function hashFile(file, chunkSize, callback) {
  var hash = XXH();
  var size = file.size;
  var offset = 0;
  var chunk = file.slice(offset, offset + chunkSize);

  var hashChunk = function() {
    var reader = new FileReader();
    reader.onload = function(e) {
      // Increment hash
      hash.update(e.target.result);

      // Update offset for next chunk
      offset += chunkSize;

      // Hash next chunk if available
      if(offset < size) {
        // Splice the next Blob from the File
        chunk = file.slice(offset, offset + chunkSize);
        // Recurse to hash next chunk
        hashChunk();
      // Done hashing
      } else {
        // Report digest
        callback.call(file, hash.digest().toString(16));
      }
    };

    reader.readAsArrayBuffer(chunk);
  };

  // Start hashing chunks
  hashChunk();
}


演示http://jsbin.com/nococoqa/5/edit?js,console,output