Start · Sprachen · JavaScript · Referenz · Metadata

Metadata

Schnittstelle

Das <code>Metadata</code>-Interface enthält Informationen über einen Dateisystemeintrag, nämlich den Zeitpunkt der letzten Änderung und die Größe in Bytes.

seit JavaScript Nicht standardisiert – nur Chromium-basierte Brows Kategorie: webapi

Signatur

interface Metadata

Beschreibung

Ein Metadata-Objekt gehört zur alten File and Directory Entries API und beschreibt einen Eintrag im Dateisystem, also eine Datei oder ein Verzeichnis. Man erstellt es nicht selbst. Es wird der Erfolgs-Callback von FileSystemEntry.getMetadata() übergeben.

Das Interface hat zwei schreibgeschützte Eigenschaften:

  • modificationTime (Date): der Zeitpunkt der letzten Änderung des Eintrags.
  • size (number): die Größe in Bytes als 64-Bit-Ganzzahl. Bei Verzeichnissen ist der Wert immer 0.

Nützlich ist Metadata vor allem in älterem Code, der mit Drag-and-Drop-Einträgen (DataTransferItem.webkitGetAsEntry()) oder dem privaten Sandbox-Dateisystem (webkitRequestFileSystem()) arbeitet. Dort kann man damit Größe und Änderungsdatum abfragen, ohne die Datei zu lesen. Für neuen Code ist das Interface nicht mehr gedacht. Besser sind File.size, File.lastModified und die File System Access API bzw. das Origin Private File System (FileSystemFileHandle.getFile()).

Rückgabewert

Typ
Metadata
Beschreibung
Ein Objekt mit den schreibgeschützten Eigenschaften modificationTime (Date) und size (number, Bytes). Man bekommt es nur über den Callback von FileSystemEntry.getMetadata().

Beispiele

Metadaten eines per Drag & Drop abgelegten Eintrags lesen

const dropZone = document.querySelector('#drop-zone');

dropZone.addEventListener('dragover', (event) => event.preventDefault());

dropZone.addEventListener('drop', (event) => {
  event.preventDefault();

  for (const item of event.dataTransfer.items) {
    const entry = item.webkitGetAsEntry?.();
    if (!entry || typeof entry.getMetadata !== 'function') continue;

    entry.getMetadata(
      (metadata) => {
        console.log(`${entry.name}: ${metadata.size} Bytes, geändert am ${metadata.modificationTime.toLocaleString('de-DE')}`);
      },
      (error) => console.error('Metadaten nicht lesbar:', error.name)
    );
  }
});
bericht.pdf: 48213 Bytes, geändert am 12.3.2024, 14:05:31

getMetadata() in ein Promise verpacken

const getMetadataAsync = (entry) =>
  new Promise((resolve, reject) => {
    if (typeof entry.getMetadata !== 'function') {
      reject(new Error('getMetadata() wird nicht unterstützt'));
      return;
    }
    entry.getMetadata(resolve, reject);
  });

// Verwendung mit async/await, z. B. innerhalb eines drop-Handlers
const describeEntry = async (entry) => {
  try {
    const { size, modificationTime } = await getMetadataAsync(entry);
    const art = entry.isDirectory ? 'Verzeichnis' : 'Datei';
    return `${art} ${entry.name} – ${(size / 1024).toFixed(1)} KiB, Stand ${modificationTime.toISOString()}`;
  } catch (err) {
    return `${entry.name}: ${err.message}`;
  }
};
Datei foto.jpg – 312.4 KiB, Stand 2024-03-12T13:05:31.000Z

Moderne Alternative: dieselben Informationen über File

const input = document.querySelector('input[type="file"]');

input.addEventListener('change', () => {
  for (const file of input.files) {
    // Entspricht metadata.size und metadata.modificationTime
    const modified = new Date(file.lastModified);
    console.log(`${file.name}: ${file.size} Bytes, geändert ${modified.toLocaleDateString('de-DE')}`);
  }
});
notizen.txt: 1024 Bytes, geändert 12.3.2024

// Wichtig · Fallstricke

  • Nicht standardisiert und veraltet: Metadata und FileSystemEntry.getMetadata() gibt es praktisch nur in Chromium-basierten Browsern. Firefox und Safari unterstützen zwar Teile der File and Directory Entries API, aber nicht getMetadata(). Prüfe deshalb vor dem Aufruf immer mit typeof entry.getMetadata === 'function', ob die Methode vorhanden ist.
  • Nur Callbacks: Die API gibt kein Promise zurück. Für async/await muss man sie selbst in ein Promise verpacken (siehe Beispiel).
  • Verzeichnisse: Bei einem Verzeichnis ist size immer 0 und gibt nicht die Gesamtgröße des Inhalts an. Die muss man selbst ausrechnen, indem man rekursiv über die Einträge geht.
  • Zeitzone: modificationTime ist ein Date-Objekt. Wie es angezeigt wird, hängt von der lokalen Zeitzone ab. Für eindeutige Werte eignet sich toISOString().
  • Neuer Code: Verwende lieber File.size/File.lastModified, die File System Access API oder das Origin Private File System. Diese Schnittstellen sind standardisiert und funktionieren browserübergreifend.