Chrome中的Javascript FileReader.onload event.currentTarget.result.ByTeleLength=0
我试图通过迭代片来读取javascript Blob,并在使用FileReader读取片后从片中重新创建Blob。在最新的Chrome中,这会间歇性地导致 event.currentTarget.result.ByTeleLength=0 或 在处理操作时找不到请求的文件或目录 过程是 1创建一个1MB的blob 2使用FileReader.onload的回调,以1024字节的增量逐个切片 3通过FileReader读取每个片段,创建一个新Blob并保存它 4重复步骤2,创建一个新的Blob,包括当前读取和上一个读取 如果一切顺利的话,我们有一个和原来一样的斑点 这在Chrome中间歇性失效 这是一把小提琴。确保打开控制台查看器 更精致的小提琴Chrome中的Javascript FileReader.onload event.currentTarget.result.ByTeleLength=0,javascript,html,google-chrome,filereader,Javascript,Html,Google Chrome,Filereader,我试图通过迭代片来读取javascript Blob,并在使用FileReader读取片后从片中重新创建Blob。在最新的Chrome中,这会间歇性地导致 event.currentTarget.result.ByTeleLength=0 或 在处理操作时找不到请求的文件或目录 过程是 1创建一个1MB的blob 2使用FileReader.onload的回调,以1024字节的增量逐个切片 3通过FileReader读取每个片段,创建一个新Blob并保存它 4重复步骤2,创建一个新的Blob,包
我遗漏了什么?您应该使用event.target.result来代替currentTarget。它可能会解决您的问题,看起来像是上一次Chrome更新,42.0.2311.135,修复了它。
<html>
<body>
Blob Test
<script>
var end = 0, i = 0, size, newBlob = new Blob(), partBlob;
var readSlice = function(event){
var bytesRead = event.currentTarget.result.byteLength;
if ( bytesRead > 0){
newBlob = new Blob([newBlob, event.currentTarget.result]);
}else{
log("Zero bytes read" , event);
return;
}
i = i + 1024;
//i = i + bytesRead;
end = i + 1024;
if ( end > bigBlob.size ) {
end = bigBlob.size;
}
if ( i < bigBlob.size){
log("i:"+i + " end:" + end);
read(bigBlob, i, end);
}else{
log(newBlob);
log(bigBlob);
newBlob = null;
bigBlob = null;
}
};
function read(blob, start, end){
partBlob = blob.slice(start, end);
log("sliced " + start + ":"+ end+", partBlob size: " + partBlob.size);
var reader = new FileReader();
reader.onerror = error;
reader.onabort = onabort;
reader.onload = readSlice;
reader.readAsArrayBuffer(partBlob);
};
function error(e){
log("error " , e);
log("i:" + i + " end:" + end);
};
function onabort(e){
log("aborted", e);
error(e);
};
function buildBlob(kb){
var uintKbArr = new Uint8Array(1024);
for(var i=0;i<uintKbArr.length;i++){
uintKbArr[i]=i%256;
}
var blobArray = [];
for(var i=0;i<kb;i++){
var b = new Blob([uintKbArr]);//adds a MB each time
blobArray.push(b);
}
bigBlob = new Blob(blobArray);
return bigBlob;
}
function log(m, o){
if ( o ){
console.log(m,o);
}else{
console.log(m);
}
}
var bigBlob = buildBlob(1024);
size = bigBlob.size;
log("Blob size " + size);
read(bigBlob, 0, 1024);
</script>
</body>
</html>