我有一个具有文件上传功能的网页。上传以 5MB 块执行。我想在将每个块发送到服务器之前计算其哈希值。块表示为Blob https://developer.mozilla.org/en/docs/Web/API/Blob对象。为了计算哈希值,我将这样的 blob 读入一个数组缓冲区 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer使用本机文件阅读器 https://developer.mozilla.org/en/docs/Web/API/FileReader。这是代码:
var reader = new FileReader();
var getHash = function (blob, callback) {
reader.onloadend = function (e) {
var hash = util.hash(e.target.result);
callback(hash);
};
reader.readAsArrayBuffer(blob);
}
var processChunk = function (chunk) {
if (chunk) {
getHash(chunk, function (hash) {
util.sendToServer(chunk, hash, function() {
// this callback is called when chunk upload is finished
processChunk(chunks.shift());
});
});
}
}
var chunks = file.splitIntoChunks(); // gets an array of blobs
processChunk(chunks.shift());
问题:使用FileReader.readAsArrayBuffer
似乎消耗了大量未释放的内存。到目前为止,我在以下浏览器上使用 5GB 文件进行了测试:
我尝试过的代码调整 - 均无济于事:
- 重复使用相同的
FileReader
所有块的实例(如这个问题 https://stackoverflow.com/questions/32102361/filereader-memory-leak)
- 创造新的
FileReader
对于每个块
- 在开始新块之前添加超时
- 设置
FileReader
和ArrayBuffer
每次读取后为空
问题:有办法解决这个问题吗?这是 FileReader 实现中的错误还是我做错了什么?
EDIT:这是一个 JSFiddlehttps://jsfiddle.net/andy250/pjt9udeu/ https://jsfiddle.net/andy250/pjt9udeu/
这是 Windows 上 Chrome 的一个错误。报道如下:https://bugs.chromium.org/p/chromium/issues/detail?id=674903 https://bugs.chromium.org/p/chromium/issues/detail?id=674903
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)