FileReader “Error ProgressEvent” на больших файлах

430
06 февраля 2017, 18:05

При загрузке больших файлов (4+ Gb),файлы открываются через стандартную функцию

var reader = new FileReader();
reader.readAsArrayBuffer(file);

в консоли браузера вываливается ошибка

Error ProgressEvent {isTrusted: true, lengthComputable: true, loaded: 0, total: 6777708138, type: "error"…}

Можно ли как то это обойти. Это нужно для подсчёта хэша файла, или может есть ещё какой-то способ получить уникальный id загружаемого файла в браузере.

Answer 1

Хром 56 читает примерно до 3Gb, потом вываливается с ошибкой браузера "Сhrome не хватает памяти".
При попытке загрузить файлы 8-200Gb сразу вываливается ошибка ProgressEvent.

Очевидно, что хром оберегает память (ха!) и не даёт её убить всю.
Можно считать произвольные 1-2Gb из файла и хэшировать их:

let inp   = document.querySelector('input'), 
    fr    = new FileReader(), 
    chunk = 100; // 100bytes 
     
inp.addEventListener('change', _ => { 
  // Если выбранный файл меньше чанка, 
  // берём всё, иначе отрезаем кусочек у начала по размеру чанка 
  let blob = inp.files[0].size <= chunk ? inp.files[0] : inp.files[0].slice(0, chunk); 
   
  fr.onloadend = _ => { 
    let chunkOfFile = fr.result; 
    console.info(chunkOfFile); 
  }; 
 
  fr.readAsArrayBuffer(blob); 
});
<input type='file' />

Работа с такими файлами в браузере - дело странное, подумайте об альтернативных путях.

READ ALSO
Проблема с плагином easyzoom.js

Проблема с плагином easyzoom.js

Использую плагин easyzoomjs для изображений, но требуется он только для ПК, а для моб

451
Некорректно срабатывает js (jquery) script

Некорректно срабатывает js (jquery) script

Есть скрипт, который при наведении на элемент меню должен менять класс у блока с подкатегориями

392
Вызов Java Script без клика

Вызов Java Script без клика

Есть код всплывающей подсказки notification, показ через onclick

429