Signatur
Beschreibung
FileReader.result enthält das Ergebnis eines Lesevorgangs, den eine der Lesemethoden des FileReader gestartet hat. Welchen Typ der Wert hat, hängt von der aufgerufenen Methode ab:
readAsText():stringmit dem dekodierten Text (Standard ist UTF-8)readAsDataURL():stringim Formatdata:<MIME-Typ>;base64,<Daten>readAsArrayBuffer():ArrayBuffermit den RohbytesreadAsBinaryString()(veraltet):string, in dem jedes Zeichen ein Byte darstellt
Das Lesen läuft asynchron ab. Einen sinnvollen Wert enthält result erst, wenn das Ereignis load (oder loadend ohne Fehler) ausgelöst wurde und readyState auf FileReader.DONE (2) steht. Solange noch gelesen wird, nach einem Fehler oder nach abort() ist der Wert null.
Man verwendet result zum Beispiel, um vom Benutzer ausgewählte Dateien vor dem Hochladen als Bildvorschau anzuzeigen, um CSV- oder JSON-Dateien direkt im Browser auszuwerten oder um Binärformate byteweise zu untersuchen.
Rückgabewert
null, solange der Lesevorgang läuft, fehlgeschlagen ist oder abgebrochen wurde.Beispiele
Bildvorschau mit readAsDataURL
// HTML: <input type="file" id="upload" accept="image/*"> <img id="preview">
const input = document.querySelector('#upload');
const preview = document.querySelector('#preview');
input.addEventListener('change', () => {
const file = input.files[0];
if (!file) return;
const reader = new FileReader();
reader.addEventListener('load', () => {
// result ist hier eine Data-URL
preview.src = reader.result;
console.log(reader.result.slice(0, 30));
});
reader.readAsDataURL(file);
});
JSON-Datei als Text lesen – als Promise gekapselt
const readFileAsText = (file) =>
new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = () => reject(reader.error);
reader.readAsText(file, 'utf-8');
});
const blob = new Blob(['{"name":"Anna","alter":32}'], { type: 'application/json' });
const text = await readFileAsText(blob);
const daten = JSON.parse(text);
console.log(daten.name, daten.alter);
Dateisignatur mit readAsArrayBuffer prüfen
const istPng = (file) =>
new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
// result ist ein ArrayBuffer
const bytes = new Uint8Array(reader.result);
const signatur = [0x89, 0x50, 0x4e, 0x47];
resolve(signatur.every((b, i) => bytes[i] === b));
};
reader.onerror = () => reject(reader.error);
// Nur die ersten 4 Bytes lesen
reader.readAsArrayBuffer(file.slice(0, 4));
});
const fake = new Blob([new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d])]);
console.log(await istPng(fake));
result ist vor dem load-Ereignis noch null
const reader = new FileReader();
reader.readAsText(new Blob(['Hallo Welt']));
console.log(reader.result); // Lesen läuft noch
console.log(reader.readyState); // 1 = LOADING
reader.onloadend = () => {
console.log(reader.result); // jetzt verfügbar
};
// Wichtig · Fallstricke
- Asynchronität: Wer
resultdirekt nach dem Aufruf vonreadAsText()o. Ä. abfragt, bekommtnull. Den Wert immer erst inonloadbzw.loadendauswerten. - Typ prüfen: Der Typ hängt von der Lesemethode ab. Bei
readAsArrayBuffer()braucht man für den Bytezugriff eine Ansicht wieUint8ArrayoderDataView. - Fehlerfall: Nach einem Fehler ist
resultgleichnull. Die Ursache steht inFileReader.error. - Speicher und Leistung: Data-URLs sind etwa 33 % größer als die Originaldatei. Für Bildvorschauen großer Dateien ist
URL.createObjectURL()meist die bessere Wahl. Für einfaches Lesen gibt es inzwischen die Promise-basierten MethodenBlob.prototype.text()undBlob.prototype.arrayBuffer(). - Sicherheit: Den Inhalt von
readAsText()niemals ungeprüft perinnerHTMLeinfügen, sonst droht XSS. BessertextContentverwenden. readAsBinaryString()ist veraltet. StattdessenreadAsArrayBuffer()verwenden.- Kompatibilität: Wird von allen modernen Browsern und in Web Workern unterstützt. Node.js bietet
FileReadererst ab Version 20 als globales Objekt an.