Signatur
Beschreibung
Die Methode getMetadata() gehört zum Interface FileSystemEntry der File and Directory Entries API. Sie fragt asynchron Metadaten zu einer Datei oder einem Verzeichnis ab und übergibt das Ergebnis als Metadata-Objekt an einen Callback. Dieses Objekt hat zwei Eigenschaften: modificationTime (ein Date mit dem Zeitpunkt der letzten Änderung) und size (Größe in Byte; bei Verzeichnissen meist 0).
Einträge vom Typ FileSystemEntry bekommt man vor allem beim Drag-and-Drop über DataTransferItem.webkitGetAsEntry() oder aus HTMLInputElement.webkitEntries bei einem <input type="file" webkitdirectory>. Mit getMetadata() lassen sich Größe und Änderungsdatum abfragen, ohne dass man die Datei erst als File-Objekt öffnen muss.
Die Methode arbeitet nur mit Callbacks und gibt kein Promise zurück. In moderner Codebasis packt man sie deshalb meist in ein Promise ein, damit man async/await verwenden kann. Wichtig: getMetadata() ist veraltet und wurde nie in den Standard aufgenommen. Für Dateien ist FileSystemFileEntry.file() die zuverlässigere Lösung, denn das zurückgegebene File liefert size und lastModified in allen Browsern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $successCallback Pflicht | (metadata: Metadata) => void | Wird bei Erfolg aufgerufen und erhält ein Metadata-Objekt mit den Eigenschaften modificationTime (Date) und size (number, in Byte). |
|
| $errorCallback | (error: DOMException) => void | Wird bei einem Fehler aufgerufen, z. B. mit NotFoundError, wenn der Eintrag nicht mehr existiert, oder mit SecurityError, wenn der Zugriff verweigert wird. |
Rückgabewert
successCallback bzw. errorCallback.Beispiele
Metadaten einer per Drag-and-Drop abgelegten Datei auslesen
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) continue;
entry.getMetadata(
(metadata) => {
console.log(`${entry.name}: ${metadata.size} Byte, geändert am ${metadata.modificationTime.toLocaleString('de-DE')}`);
},
(error) => console.error(`Metadaten für ${entry.name} nicht lesbar:`, error.name)
);
}
});
Callback-API in ein Promise einpacken (mit Ersatzweg)
const getMetadataAsync = (entry) =>
new Promise((resolve, reject) => {
if (typeof entry.getMetadata === 'function') {
entry.getMetadata(resolve, reject);
} else if (entry.isFile) {
// Ersatzweg für Browser ohne getMetadata()
entry.file(
(file) => resolve({ size: file.size, modificationTime: new Date(file.lastModified) }),
reject
);
} else {
reject(new Error('Metadaten für Verzeichnisse nicht verfügbar'));
}
});
// Verwendung im Drop-Handler
document.addEventListener('drop', async (event) => {
event.preventDefault();
const entry = event.dataTransfer.items[0]?.webkitGetAsEntry();
if (!entry) return;
try {
const { size, modificationTime } = await getMetadataAsync(entry);
console.log({ name: entry.name, size, modificationTime });
} catch (err) {
console.warn('Fehler:', err.message ?? err.name);
}
});
Zu große Dateien vor dem Hochladen herausfiltern
const MAX_BYTES = 5 * 1024 * 1024; // 5 MB
const checkSize = (entry) =>
new Promise((resolve, reject) => entry.getMetadata(resolve, reject))
.then(({ size }) => ({ entry, ok: size <= MAX_BYTES, size }));
document.addEventListener('drop', async (event) => {
event.preventDefault();
const entries = [...event.dataTransfer.items]
.map((item) => item.webkitGetAsEntry())
.filter((e) => e?.isFile);
const results = await Promise.all(entries.map(checkSize));
for (const { entry, ok, size } of results) {
console.log(`${entry.name}: ${ok ? 'OK' : 'zu groß'} (${(size / 1024).toFixed(1)} KB)`);
}
});
// Wichtig · Fallstricke
- Veraltet und nicht standardisiert:
getMetadata()steht nicht in der aktuellen Spezifikation der File and Directory Entries API. Nur Chromium-basierte Browser unterstützen sie; Firefox und Safari kennen sie nicht. Prüfe deshalb immer vorher mittypeof entry.getMetadata === 'function', ob die Methode vorhanden ist. - Empfohlene Alternative: Für Dateien
FileSystemFileEntry.file()verwenden. DasFile-Objekt liefertsizeundlastModifiedin allen Browsern. Für neue Projekte ist die File System Access API (FileSystemHandle,getFile()) zukunftssicherer. - Nur Callbacks: Es gibt keinen
Promise-Rückgabewert.await entry.getMetadata()liefertundefinedund ist ein häufiger Fehler. - Nur solange das Ereignis läuft:
DataTransferItem-Objekte sind nur während desdrop-Ereignisses gültig. RufewebkitGetAsEntry()deshalb gleich im Handler auf, bevor du irgendetwas mitawaitabwartest. Das Entry-Objekt selbst bleibt danach nutzbar. - Verzeichnisse: Bei
FileSystemDirectoryEntryistsizein der Regel0und damit nicht aussagekräftig. - Nur in einem sicheren Kontext (HTTPS) und nur für Dateien, die der Nutzer selbst ausgewählt oder abgelegt hat. Ein freier Zugriff auf das Dateisystem ist nicht möglich.