Start · Sprachen · JavaScript · Referenz · HTMLInputElement.webkitEntries

HTMLInputElement.webkitEntries

Eigenschaft

Schreibgeschütztes Array von <code>FileSystemEntry</code>-Objekten, das die in einem <code>&lt;input type="file"&gt;</code> ausgewählten Dateien bzw. Verzeichnisse darstellt.

seit JavaScript Chrome 22+, Edge 14+, Firefox 50+, Safari 11.1+ (n Kategorie: webapi

Signatur

HTMLInputElement.webkitEntries

Beschreibung

Die schreibgeschützte Eigenschaft webkitEntries eines <input type="file">-Elements liefert ein Array von Einträgen der File and Directory Entries API. Jeder Eintrag ist entweder ein FileSystemFileEntry (Datei) oder ein FileSystemDirectoryEntry (Verzeichnis). Beide erben von FileSystemEntry.

Im Gegensatz zu HTMLInputElement.files, das nur eine flache FileList liefert, kann man mit den Einträgen Verzeichnisstrukturen durchlaufen. Das geht über FileSystemDirectoryEntry.createReader() und readEntries(). Ob überhaupt Verzeichnisse ausgewählt werden können, hängt vom Attribut webkitdirectory ab.

Wichtiger Hinweis zur Praxis: In vielen Browsern (vor allem Chrome) ist das Array bei Auswahl über den normalen Dateidialog leer. Zuverlässig mit Einträgen gefüllt wird es meist nur beim Ablegen per Drag & Drop auf das Input-Element. Für Drag & Drop auf beliebige Elemente nimmt man stattdessen DataTransferItem.webkitGetAsEntry().

Rückgabewert

Typ
FileSystemEntry[]
Beschreibung
Ein Array von FileSystemEntry-Objekten (FileSystemFileEntry bzw. FileSystemDirectoryEntry). Wurde nichts ausgewählt oder unterstützt der Browser die Eigenschaft in diesem Fall nicht, ist das Array leer.

Beispiele

Ausgewählte Einträge auflisten

// <input type="file" id="picker" webkitdirectory multiple>
const picker = document.getElementById('picker');

picker.addEventListener('change', () => {
  const entries = picker.webkitEntries;
  if (entries.length === 0) {
    console.log('Keine Einträge, Fallback auf files:', picker.files.length);
    return;
  }
  for (const entry of entries) {
    console.log(entry.isDirectory ? '📁' : '📄', entry.fullPath);
  }
});
📁 /projekt (oder bei leerem Array: Keine Einträge, Fallback auf files: 12)

Verzeichnis rekursiv durchlaufen (Promise-basiert)

const readAllEntries = (dirEntry) => new Promise((resolve, reject) => {
  const reader = dirEntry.createReader();
  const all = [];
  // readEntries liefert Ergebnisse stückweise – so lange lesen, bis ein leeres Array kommt
  const readBatch = () => reader.readEntries((batch) => {
    if (batch.length === 0) return resolve(all);
    all.push(...batch);
    readBatch();
  }, reject);
  readBatch();
});

const collectFiles = async (entry, result = []) => {
  if (entry.isFile) {
    const file = await new Promise((res, rej) => entry.file(res, rej));
    result.push({ path: entry.fullPath, size: file.size });
  } else if (entry.isDirectory) {
    for (const child of await readAllEntries(entry)) {
      await collectFiles(child, result);
    }
  }
  return result;
};

const input = document.querySelector('input[type=file]');
input.addEventListener('drop', async () => {
  // Einträge stehen nach dem Drop zur Verfügung
  await new Promise((r) => setTimeout(r));
  for (const entry of input.webkitEntries) {
    console.table(await collectFiles(entry));
  }
});
Tabelle mit path/size aller Dateien, z. B. /fotos/urlaub/bild1.jpg | 204811

Feature-Erkennung mit Fallback

const input = document.querySelector('input[type=file]');
const supportsEntries = 'webkitEntries' in HTMLInputElement.prototype;

input.addEventListener('change', () => {
  if (supportsEntries && input.webkitEntries.length > 0) {
    console.log('Einträge-API:', input.webkitEntries.map((e) => e.name));
  } else {
    // webkitRelativePath enthält bei webkitdirectory den relativen Pfad
    console.log('FileList:', [...input.files].map((f) => f.webkitRelativePath || f.name));
  }
});
FileList: ["projekt/index.html", "projekt/css/style.css"]

// Wichtig · Fallstricke

  • Nicht standardisiert: Die Eigenschaft gehört zum Entwurf der File and Directory Entries API und hat das Präfix webkit, auch in Firefox. Für Produktivcode immer eine Feature-Erkennung und einen Fallback auf input.files einbauen.
  • Häufig leer: Bei Auswahl über den Dateidialog liefert Chrome ein leeres Array. Wer verlässlich Einträge braucht, sollte Drag & Drop mit DataTransferItem.webkitGetAsEntry() verwenden oder bei webkitdirectory mit File.webkitRelativePath arbeiten.
  • readEntries() liefert Ergebnisse stückweise (in Chrome höchstens 100 pro Aufruf). Man muss so oft erneut aufrufen, bis ein leeres Array zurückkommt, sonst fehlen Dateien.
  • Die API arbeitet mit Callbacks statt Promises, deshalb braucht man eigene Promise-Wrapper.
  • Für echten Lese- und Schreibzugriff auf das Dateisystem ist die modernere File System Access API (showDirectoryPicker()) gedacht. Sie wird allerdings nur in Chromium-Browsern unterstützt.
  • Die Einträge sind ein Sandbox-Abbild der Auswahl. Einen Zugriff auf absolute Pfade des Nutzersystems gibt es nicht.