Usando FileReader.readAsArrayBuffer () en archivos modificados en Firefox

Me encuentro con un problema extraño usandoFileReader.readAsArrayBuffer eso solo parece afectar a Firefox (lo probé en la versión actual - v40). No puedo decir si solo estoy haciendo algo mal o si esto es un error de Firefox.

Tengo algunos JavaScript que usanreadAsArrayBuffer para leer un archivo especificado en un<input> campo. En circunstancias normales, todo funciona correctamente. Sin embargo, si el usuario modifica el archivo después de seleccionarlo en el<input> campo,readAsArrayBuffer Puede confundirse mucho.

losArrayBuffer Regreso dereadAsArrayBuffer siempre tiene la longitud original del archivo. Si el usuario cambia el archivo para hacerlo más grande, no obtengo ninguno de los bytes después del tamaño original. Si el usuario cambia el archivo para hacerlo más pequeño, el búfer sigue siendo del mismo tamaño y el 'exceso' en el búfer se llena con los códigos de caracteres 90 (letra mayúscula 'Z' si se ve como una cadena).

Dado que este código es tan simple y funciona perfectamente en cualquier otro navegador que probé, creo que es un problema de Firefox. Helo reportó como un error a Firefox pero quiero asegurarme de que esto no sea solo algo obvio que estoy haciendo mal.

El siguiente fragmento de código puede reproducir el comportamiento. Todo lo que tienes que hacer es:

Busque un archivo de texto que contenga 10 caracteres (10 no es un número mágico; solo lo estoy usando como ejemplo)Observe que el resultado es una matriz de 10 elementos que representan los códigos de caracteres de cada elemento.Mientras esto todavía se está ejecutando, elimine 5 caracteres del archivo y guardeObserve que el resultado sigue siendo una matriz de 10 elementos: los primeros 5 son correctos pero los últimos 5 son todos 90 (mayúscula Z)Ahora se agregaron 10 caracteres (por lo que el archivo ahora tiene 15 caracteres)Observe que el resultado sigue siendo una matriz de 10 elementos: los últimos 5 no se devuelven

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>

En caso de que el fragmento no funcione, el código de muestra también está disponible como JSFiddle aquí:https://jsfiddle.net/Lv5y9m2u/

Respuestas a la pregunta(2)

Su respuesta a la pregunta