Я реализую загрузчик фрагментированных файлов на основе браузера. Чтобы открыть файл, я использую <input type="file" id="fileSelector" />
и этот фрагмент кода (упрощенный):
$('#fileSelector').on('change', function () {
_file = evt.target.files[0];
});
Я нарезаю файл на куски, но не читаю кусок в память (не явно).
Проблема: иногда (менее 0,1 % загруженных файлов) фрагмент, вырезанный из базового файла, оказывается пустым. Например. во время загрузки большого файла все идет хорошо, а затем в середине этого файла вызывается:
var _blob = _file.slice(chunk.start, chunk.end, _file.type);
приводит к пустому фрагменту (_blob.size
равен 0). Отправка такого большого двоичного объекта на сервер (.NET 4.6) приводит к тому, что Request.InputStream
становится пустым. Я отправляю двоичные данные:
_xhr.setRequestHeader('content-type', 'application/octet-stream');
_xhr.send(_blob);
Я также должен упомянуть, что повторный вызов _file.slice
создает тот же пустой блоб. Я могу наблюдать это в Chrome 57, Chrome 60 (Win и Mac), Mac Safari 10.1.1 и в Edge 15. Возможны и другие браузеры.
Что может быть не так? Вещи, которые я рассматриваю:
- файл используется
- файл/диск поврежден
- в то же время blob GCed движком JavaScript - если это может быть так, как убедиться, что он не GCed?
- ошибка браузера (я нашел это, но не уверен, что это связано: https://bugs.chromium.org/p/chromium/issues/detail?id=167111)