Signatur
Beschreibung
Metadata.size gehört zur alten File and Directory Entries API (früher „FileSystem API“). Ein Metadata-Objekt bekommst du nur über FileSystemEntry.getMetadata(). Es beschreibt einen Eintrag im Dateisystem. Neben size gibt es noch die Eigenschaft modificationTime.
Der Wert ist eine Ganzzahl und gibt die Größe der Datei in Bytes an. Bei Verzeichnissen (FileSystemDirectoryEntry) ist size laut Spezifikationsentwurf immer 0. Die Größe des Inhalts wird also nicht zusammengezählt. Die Eigenschaft ist schreibgeschützt: Wenn du ihr etwas zuweist, passiert nichts.
Typische Einsatzfälle waren Anwendungen, die mit dem sandboxed Dateisystem von webkitRequestFileSystem() gearbeitet haben, und Drag-and-drop-Uploads über DataTransferItem.webkitGetAsEntry(). So konnte man Dateigrößen prüfen, ohne den Inhalt zu lesen. Für neuen Code solltest du die Größe lieber über ein File-Objekt ermitteln (File.size). An ein solches Objekt kommst du zum Beispiel über FileSystemFileEntry.file() oder FileSystemFileHandle.getFile().
Rückgabewert
0.Beispiele
Dateigröße per Drag-and-drop ermitteln
const dropZone = document.querySelector('#drop');
dropZone.addEventListener('dragover', (e) => e.preventDefault());
dropZone.addEventListener('drop', (e) => {
e.preventDefault();
for (const item of e.dataTransfer.items) {
const entry = item.webkitGetAsEntry?.();
if (!entry || typeof entry.getMetadata !== 'function') continue;
entry.getMetadata(
(metadata) => {
console.log(`${entry.name}: ${metadata.size} Bytes`);
},
(err) => console.error('Metadaten nicht lesbar:', err.name)
);
}
});
Promise-Wrapper und Größenlimit prüfen
const getMetadata = (entry) =>
new Promise((resolve, reject) => entry.getMetadata(resolve, reject));
const MAX_BYTES = 5 * 1024 * 1024; // 5 MiB
const pruefeGroesse = async (entry) => {
const { size, modificationTime } = await getMetadata(entry);
if (entry.isDirectory) {
console.log(`${entry.name} ist ein Verzeichnis (size = ${size})`);
return true;
}
const ok = size <= MAX_BYTES;
console.log(`${entry.name}: ${(size / 1024).toFixed(1)} KiB, geändert ${modificationTime.toLocaleString('de-DE')} – ${ok ? 'OK' : 'zu groß'}`);
return ok;
};
Zukunftssichere Alternative mit Fallback
// Bevorzugt File.size nutzen, getMetadata() nur als Rückfallebene
const dateiGroesse = (entry) =>
new Promise((resolve, reject) => {
if (entry.isFile && typeof entry.file === 'function') {
entry.file((file) => resolve(file.size), reject);
} else if (typeof entry.getMetadata === 'function') {
entry.getMetadata((m) => resolve(m.size), reject);
} else {
resolve(0); // Verzeichnis ohne Metadaten-Unterstützung
}
});
// Verwendung im drop-Handler:
// const bytes = await dateiGroesse(item.webkitGetAsEntry());
// Wichtig · Fallstricke
- Veraltet und nicht standardisiert:
FileSystemEntry.getMetadata()und damit auchMetadatasind nur in Chromium-basierten Browsern verfügbar. Firefox und Safari unterstützengetMetadata()nicht, obwohl siewebkitGetAsEntry()kennen. Prüfe deshalb vorher mittypeof entry.getMetadata === 'function', ob die Methode vorhanden ist. - Verzeichnisse:
sizeist bei Verzeichnissen immer0. Die Gesamtgröße eines Ordners musst du selbst berechnen: Lies die Einträge rekursiv mitcreateReader().readEntries()ein und addiere die Dateigrößen. - Nur Callbacks: Die API arbeitet mit Callbacks statt Promises. Wenn du sie mit
async/awaitnutzen willst, brauchst du einen eigenen Promise-Wrapper. - Momentaufnahme: Der Wert gilt für den Zeitpunkt, an dem die Metadaten abgefragt wurden. Ändert sich die Datei danach, wird er nicht automatisch aktualisiert.
- Empfehlung: Für neuen Code solltest du
File.sizeverwenden. Das funktioniert überFileSystemFileEntry.file(), über<input type=\"file\">oder über die File System Access API (FileSystemFileHandle.getFile()).