Start · Sprachen · JavaScript · Referenz · Metadata.size

Metadata.size

Eigenschaft

Schreibgeschützte Eigenschaft von <code>Metadata</code>, die die Größe einer Datei in Bytes angibt. Für Verzeichnisse ist der Wert <code>0</code>.

seit JavaScript Nicht standardisiert, veraltet: nur Chromium-basie Kategorie: webapi

Signatur

Metadata.size

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

Typ
number
Beschreibung
Die Größe der Datei in Bytes als ganze Zahl (≥ 0). Bei Verzeichnissen ist der Wert 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)
    );
  }
});
bericht.pdf: 482133 Bytes

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;
};
foto.jpg: 2048.0 KiB, geändert 12.3.2024, 10:15:00 – OK ordner ist ein Verzeichnis (size = 0)

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 auch Metadata sind nur in Chromium-basierten Browsern verfügbar. Firefox und Safari unterstützen getMetadata() nicht, obwohl sie webkitGetAsEntry() kennen. Prüfe deshalb vorher mit typeof entry.getMetadata === 'function', ob die Methode vorhanden ist.
  • Verzeichnisse: size ist bei Verzeichnissen immer 0. Die Gesamtgröße eines Ordners musst du selbst berechnen: Lies die Einträge rekursiv mit createReader().readEntries() ein und addiere die Dateigrößen.
  • Nur Callbacks: Die API arbeitet mit Callbacks statt Promises. Wenn du sie mit async/await nutzen 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.size verwenden. Das funktioniert über FileSystemFileEntry.file(), über <input type=\"file\"> oder über die File System Access API (FileSystemFileHandle.getFile()).