Este equipo de trabajo ha estado por horas investigando para dar espuestas a tu pregunta, te compartimos la respuesta de modo que deseamos servirte de gran ayuda.
Solución:
Interesante, parece que Firefox está almacenando en caché el tamaño del búfer, incluso si se modifica el archivo.
Puede consultar este enlace, reemplazado readAsArrayBuffer
con es funcionalidad personalizada que utiliza readAsBinaryString
. Funciona bien en Firefox y Chrome.
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]);
if (FileReader.prototype.readAsArrayBuffer && FileReader.prototype.readAsBinaryString)
FileReader.prototype.readAsArrayBuffer = function readAsArrayBuffer ()
this.readAsBinaryString.apply(this, arguments);
this.__defineGetter__('resultString', this.__lookupGetter__('result'));
this.__defineGetter__('result', function ()
var string = this.resultString;
var result = new Uint8Array(string.length);
for (var i = 0; i < string.length; i++)
result[i] = string.charCodeAt(i);
return result.buffer;
);
;
ReadFile();
Creo que estás golpeando un error de Firefox. Sin embargo, como usted ha señalado, readAsArrayBuffer
se comporta correctamente en todos los navegadores compatibles, excepto Firefox, mientras que readAsBinaryString
es compatible con todos los navegadores excepto IE.
Por lo tanto, es posible preferir readAsBinaryString
cuando existe y fallar de nuevo a readAsArrayBuffer
de lo contrario.
function readFileAsArrayBuffer(file, success, error)
var fr = new FileReader();
fr.addEventListener('error', error, false);
if (fr.readAsBinaryString)
fr.addEventListener('load', function ()
var string = this.resultString != null ? this.resultString : this.result;
var result = new Uint8Array(string.length);
for (var i = 0; i < string.length; i++)
result[i] = string.charCodeAt(i);
success(result.buffer);
, false);
return fr.readAsBinaryString(file);
else
fr.addEventListener('load', function ()
success(this.result);
, false);
return fr.readAsArrayBuffer(file);
Uso:
readFileAsArrayBuffer(input.files[0], function(data)
var array = new Int8Array(data);
output.value = JSON.stringify(array, null, ' ');
window.setTimeout(ReadFile, 1000);
, function (e)
console.error(e);
);
Violín de trabajo: https://jsfiddle.net/Lv5y9m2u/6/
Soporte del navegador:
- Firefox: Usos
readAsBinaryString
lo cual no es problemático. - IE >= 10: Usos
readAsArrayBuffer
que es compatible. - IE <= 9: Todo
FileReader
La API no es compatible. - Casi todos los demás navegadores: Usos
readAsBinaryString
.
Al final de todo puedes encontrar las ilustraciones de otros desarrolladores, tú igualmente eres capaz dejar el tuyo si dominas el tema.