您的浏览器如何决定触发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);
});
答案 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();
}