Usando FileReader.readAsArrayBuffer () em arquivos alterados no Firefox

Estou com um problema estranho usandoFileReader.readAsArrayBuffer isso parece afetar apenas o Firefox (eu testei na versão atual - v40). Não sei dizer se estou fazendo algo errado ou se é um bug do Firefox.

Eu tenho algum JavaScript que usareadAsArrayBuffer para ler um arquivo especificado em um<input> campo. Sob circunstâncias normais, tudo funciona corretamente. No entanto, se o usuário modificar o arquivo após selecioná-lo no<input> campo,readAsArrayBuffer pode ficar muito confuso.

oArrayBuffer Eu volto dereadAsArrayBuffer sempre tem o tamanho que o arquivo era originalmente. Se o usuário alterar o arquivo para aumentá-lo, não recebo nenhum dos bytes após o tamanho original. Se o usuário alterar o arquivo para torná-lo menor, o buffer ainda será do mesmo tamanho e o 'excesso' no buffer será preenchido com os códigos de caracteres 90 (letra maiúscula 'Z' se visualizada como uma string).

Como esse código é muito simples e funciona perfeitamente em todos os outros navegadores que testei, acho que é um problema do Firefox. Eu tenhorelatou isso como um bug para o Firefox, mas quero garantir que isso não seja apenas algo óbvio que estou fazendo de errado.

O comportamento pode ser reproduzido pelo seguinte trecho de código. Tudo que você tem a fazer é:

Procure um arquivo de texto com 10 caracteres (10 não é um número mágico - estou apenas usando-o como exemplo)Observe que o resultado é uma matriz de 10 itens que representam os códigos de caracteres de cada itemEnquanto isso ainda estiver em execução, exclua 5 caracteres do arquivo e salveObserve que o resultado ainda é uma matriz de 10 itens - os 5 primeiros estão corretos, mas os 5 últimos são todos 90 (letra maiúscula Z)Agora foram adicionados 10 caracteres (para que o arquivo tenha agora 15 caracteres)Observe que o resultado ainda é uma matriz de 10 itens - os últimos 5 não são retornados

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>

Caso o trecho não funcione, o código de amostra também estará disponível como um JSFiddle aqui:https://jsfiddle.net/Lv5y9m2u/

questionAnswers(2)

yourAnswerToTheQuestion