尝试读取大文件时,Chrome HTML5 FileReader崩溃

时间:2014-01-08 20:57:32

标签: javascript html5 google-chrome filereader jszip

我有一个表单,允许用户选择要上传的zip文件。我试图在将此zip文件上传到我的服务器之前对其进行客户端验证,因为上传可能需要一段时间,我还想节省带宽。

我需要做的就是读取应包含在zip中的.csv文件,并验证.csv中引用的zip中是否存在其他文件。为此,我尝试使用JSZip

如果存档很小,这很有用。如果存档很大(使用~500MB文件进行测试),则Chrome会崩溃。

var  reader = new FileReader();
reader.onload = function (e) {
  console.log("Got here!");
  // Read csv using JSZip, validate zip contents
};
reader.readAsArrayBuffer(file);

在我的代码中,我已经注释掉了我的onload回调中的所有逻辑,并验证了这些都没有导致崩溃。我发现在调用onload回调之前Chrome崩溃了。

我在FireFox中使用更大的zip文件进行了测试,效果很好。

1 个答案:

答案 0 :(得分:1)

浏览器选项卡内存不足。

要使用这么大的文件,您应该一次加载 slice

使用File.slice(start, end + 1),将生成的var zoomScale = 0.5 $(".draggable").draggable({ drag: function(event, ui) { var changeLeft = ui.position.left - ui.originalPosition.left; // find change in left var newLeft = ui.originalPosition.left + changeLeft / zoomScale; // adjust new left by our zoomScale var changeTop = ui.position.top - ui.originalPosition.top; // find change in top var newTop = ui.originalPosition.top + changeTop / zoomScale; // adjust new top by our zoomScale ui.position.left = newLeft; ui.position.top = newTop; } }); 读作Blob,处理该块,然后确保不会对其进行任何引用,以便可以对其进行垃圾回收。

根据您对块的操作,您甚至可能必须设置超时以给车库收集器额外的时间来达到它。确保测试您支持的所有浏览器,因为有些可能会迫使您有更大的超时或更小的块。另外,请记住,在过载功能不足的计算机上,垃圾收集可能需要更长的时间。

This is a good example of slicing.当然,你会切成更大的碎片。您可能还希望将其与页面上的下一个示例结合使用,以便提供有关进度的反馈,其中包括从当前块号中除了从慢/远程存储中获取块。