Saltar al contenido

Uso de FileReader.readAsArrayBuffer() en archivos modificados en Firefox

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 readAsBinaryStringlo 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *