JavaScript 中的文件切片会导致空 blob

and*_*250 5 html javascript chunking

我正在实现一个基于浏览器的分块文件上传器。要打开我正在使用的文件<input type="file" id="fileSelector" />和这段代码(简化):

$('#fileSelector').on('change', function () {
    _file = evt.target.files[0];
});
Run Code Online (Sandbox Code Playgroud)

我将文件切成块,但没有将块读入内存(不明确)。

问题:偶尔(对于上传文件的不到 0.1%)从底层文件切下的块是空的。例如,在上传大文件期间一切顺利,然后在该文件调用的中间:

var _blob = _file.slice(chunk.start, chunk.end, _file.type);
Run Code Online (Sandbox Code Playgroud)

结果是一个空切片(_blob.size为 0)。将此类 blob 发送到服务器 (.NET 4.6) 会导致Request.InputStream空值。我正在发送二进制数据:

_xhr.setRequestHeader('content-type', 'application/octet-stream');
_xhr.send(_blob);
Run Code Online (Sandbox Code Playgroud)

我还应该提到,_file.slice再次调用会产生相同的空 blob。我可以在 Chrome 57、Chrome 60(Win 和 Mac)、Mac Safari 10.1.1 和 Edge 15 中观察到这一点。其他浏览器也是可能的。

有什么问题吗?我正在考虑的事情:

  • 文件正在使用中
  • 文件/磁盘已损坏
  • 与此同时,该 blob 被 JavaScript 引擎 GCed - 如果是这种情况,如何确保它不被 GCed?
  • 浏览器错误(我发现了这个,但不确定它是否相关:https://bugs.chromium.org/p/chromium/issues/detail?id =167111 )

and*_*250 2

答案非常简单:这就是上传的文件消失(重命名、删除)时发生的情况。