Sto incontrando un problema strano utilizzando FileReader.readAsArrayBuffer
che sembra interessare solo Firefox (ho provato nella versione corrente - v40). Non posso dire se sto facendo qualcosa di sbagliato o se si tratta di un bug di Firefox.Utilizzo di FileReader.readAsArrayBuffer() sui file modificati in Firefox
Ho qualche JavaScript che utilizza readAsArrayBuffer
per leggere un file specificato in un campo <input>
. In circostanze normali, tutto funziona correttamente. Tuttavia, se l'utente modifica il file dopo averlo selezionato nel campo <input>
, readAsArrayBuffer
può diventare molto confuso.
Il ArrayBuffer
ritorno da readAsArrayBuffer
ha sempre la lunghezza del file originale. Se l'utente cambia il file per ingrandirlo, non ottengo nessuno dei byte dopo la dimensione originale. Se l'utente cambia il file per renderlo più piccolo, il buffer ha ancora la stessa dimensione e l''eccesso' nel buffer è riempito con i codici di carattere 90 (maiuscola 'Z' se vista come una stringa).
Poiché questo codice è così semplice e funziona perfettamente in tutti gli altri browser che ho provato, penso che sia un problema di Firefox. Io ho reported it as a bug per Firefox ma voglio assicurarmi che questo non sia solo ovvio che sto sbagliando.
Il comportamento può essere riprodotto dal seguente frammento di codice. Tutto quello che dovete fare è:
- Cerca un file di testo che dispone di 10 caratteri in esso (10 non è un numero magico - sto solo usando come un esempio)
- Osservare che il risultato è una serie di 10 elementi che rappresentano i codici carattere di ogni articolo
- Mentre è ancora in esecuzione, eliminare 5 caratteri dal file e salvare
- Osservare che il risultato è ancora una matrice di 10 elementi: i primi 5 sono corretti ma gli ultimi 5 sono tutti 90 (maiuscola Z)
- Ora aggiunto 10 caratteri (quindi il file è ora 15 chara cters lunghi)
- Osservare che il risultato è ancora un array di 10 elementi - l'ultimo 5 non vengono restituiti
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>
Nel caso frammento non funziona, il codice di esempio è anche disponibile come JSFiddle qui: https://jsfiddle.net/Lv5y9m2u/
Firefox potrebbe avere problemi con quello infatti ... Il tentativo di caricare il violino si è schiantato il mio Nightly. Ora funziona, però. – Oriol
@Oriol Come parte della sperimentazione di questa piccola versione e della mia app più grande che utilizza questa logica, mi sono imbattuto in molti arresti anomali in Firefox. :-(Io non uso Firefox (eccetto per testare la compatibilità cross-browser) quindi non ero sicuro se Firefox fosse solo buggato in generale, buggato con FileReader o cosa. _Nessun attacco destinato ai fan di Firefox_ –
Forse correlato al fatto che FF non aggiorna i 'file' dell'input se il nome è lo stesso (nessun evento onchange attivato) – Kaiido