Нарезка файла в JavaScript приводит к пустому двоичному объекту

Я реализую загрузчик фрагментированных файлов на основе браузера. Чтобы открыть файл, я использую <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)

person andy250    schedule 05.09.2017    source источник
comment
stackoverflow.com/a/24834417/1606432 Это дает дополнительное представление о проверке файлов и BLOB-объектов.   -  person Pogrindis    schedule 05.09.2017
comment
Не могли бы вы поделиться, как вы вычисляете начало и конец чанка. Вы пробовали с Firefox/Edge?   -  person    schedule 05.09.2017
comment
@ K3N Да, пробовал во многих браузерах и ОС, и это работает в 99,9% случаев. Начало и конец вычисляются более менее так: var start = N * _chunkSize; var end = Math.min (начало + _chunkSize, _file.size); Где N — номер текущего фрагмента (начиная с 0).   -  person andy250    schedule 06.09.2017
comment
Почему и как вы используете FileReader?   -  person Kaiido    schedule 06.09.2017
comment
@Kaiido - хорошая мысль. На самом деле нет. Я обновил вопрос сейчас.   -  person andy250    schedule 06.09.2017
comment
@ K3N Я использую настроенную версию plupload3. Вот расчет количества фрагментов: github.com/andy250/ plupload/blob/3.x/src/FileUploader.js#L84. Полный процесс распространяется на другие файлы помимо FileUploader.js: github.com/andy250/plupload/blob/3.x/src/core/Queue.js и, возможно, еще парочка. Я серьезно сомневаюсь, что эти расчеты являются проблемой, поскольку процесс обычно работает. Я мог бы согласиться с тем, что есть проблема с областью видимости переменных.   -  person andy250    schedule 06.09.2017


Ответы (1)


Ответ оказался очень простым: вот что бывает, когда загружаемый файл пропал (переименовал, удалил).

person andy250    schedule 07.09.2017
comment
Хотя эта проблема как-то помогла мне, реальным решением для меня было stackoverflow.com/questions/32898082/, в любом случае +1 - person Martin Shishkov; 16.04.2018