Использование FileReader.readAsArrayBuffer () для измененных файлов в Firefox

Я сталкиваюсь с странной проблемой, используяFileReader.readAsArrayBuffer это только влияет на Firefox (я тестировал в текущей версии - v40). Я не могу сказать, делаю ли я что-то неправильно или это ошибка в Firefox.

У меня есть JavaScript, который используетreadAsArrayBuffer читать файл, указанный в<input> поле. В нормальных условиях все работает правильно. Однако, если пользователь изменяет файл после его выбора в<input> поле,readAsArrayBuffer может быть очень запутанным.

ArrayBuffer Я вернусь изreadAsArrayBuffer всегда имеет длину, в которой файл был изначально. Если пользователь изменяет файл, чтобы увеличить его, я не получаю ни одного байта после исходного размера. Если пользователь изменяет файл, чтобы он стал меньше, размер буфера остается прежним, а «избыток» в буфере заполняется кодами символов 90 (заглавная буква «Z», если рассматривать ее в виде строки).

Поскольку этот код очень прост и отлично работает в любом другом браузере, который я тестировал, я думаю, что это проблема Firefox. Ясообщил об этом как об ошибке в Firefox, но я хочу убедиться, что это не просто очевидно, что я делаю неправильно.

Поведение может быть воспроизведено с помощью следующего фрагмента кода. Все, что вам нужно сделать, это:

Найдите текстовый файл, содержащий 10 символов (10 не волшебное число - я просто использую его в качестве примера)Обратите внимание, что результатом является массив из 10 элементов, представляющих коды символов каждого элементаПока он еще работает, удалите 5 символов из файла и сохранитеОбратите внимание, что результат по-прежнему массив из 10 элементов - первые 5 верны, но последние 5 все 90 (заглавная буква Z)Теперь добавлено 10 символов (поэтому файл теперь имеет длину 15 символов)Обратите внимание, что в результате по-прежнему массив из 10 элементов - последние 5 не возвращаются

function ReadFile() {
  var input = document.getElementsByTagName("input")[0];
  var output = document.getElementsByTagName("textarea")[0];

  if (input.files.length === 0) {
    output.value = 'No file selected';
    window.setTimeout(ReadFile, 1000);
    return;
  }

  var fr = new FileReader();
  fr.onload = function() {
    var data = fr.result;
    var array = new Int8Array(data);
    output.value = JSON.stringify(array, null, '  ');
    window.setTimeout(ReadFile, 1000);
  };
  fr.readAsArrayBuffer(input.files[0]);

  //These two methods work correctly
  //fr.readAsText(input.files[0]);
  //fr.readAsBinaryString(input.files[0]);
}

ReadFile();
<input type="file" />
<br/>
<textarea cols="80" rows="10"></textarea>

В случае, если фрагмент не работает, образец кода также доступен как JSFiddle здесь:https://jsfiddle.net/Lv5y9m2u/

Ответы на вопрос(0)

Ваш ответ на вопрос