Signatur
Beschreibung
Die Eigenschaft webkitdirectory gehört zu HTMLInputElement und spiegelt das gleichnamige HTML-Attribut wider. Ist sie true, zeigt ein <input type="file"> statt der normalen Dateiauswahl einen Ordner-Dialog. Nach der Auswahl enthält input.files alle Dateien des gewählten Verzeichnisses, auch die aus Unterordnern. Die Ordnerstruktur ist also flach aufgelistet.
Jedes File-Objekt hat dann die Eigenschaft webkitRelativePath. Sie enthält den Pfad relativ zum gewählten Ordner, zum Beispiel "fotos/urlaub/strand.jpg". Daraus lässt sich die Verzeichnisstruktur wieder aufbauen, etwa für Uploads ganzer Projektordner, Foto-Importe oder Werkzeuge, die lokale Dateien im Browser verarbeiten.
Die Eigenschaft lässt sich lesen und setzen. Setzt man sie per JavaScript auf true, entspricht das dem Attribut webkitdirectory im HTML. Setzt man sie auf false, wird das Attribut entfernt. Nur bei type="file" hat sie eine Wirkung.
Rückgabewert
true, wenn das Attribut webkitdirectory gesetzt ist und ein Ordner ausgewählt wird. Sonst false. Die Eigenschaft ist les- und schreibbar.Beispiele
Ordner-Auswahl per JavaScript aktivieren
// HTML: <input type="file" id="ordner">
const input = document.querySelector('#ordner');
// Prüfen, ob der Browser die Eigenschaft kennt
if ('webkitdirectory' in input) {
input.webkitdirectory = true;
console.log('Ordnerauswahl aktiv:', input.webkitdirectory);
console.log('Attribut gesetzt:', input.hasAttribute('webkitdirectory'));
} else {
console.warn('Ordnerauswahl wird nicht unterstützt');
}
Alle Dateien eines Ordners mit relativem Pfad auflisten
// HTML: <input type="file" id="ordner" webkitdirectory>
// <ul id="liste"></ul>
const input = document.querySelector('#ordner');
const liste = document.querySelector('#liste');
input.addEventListener('change', () => {
liste.replaceChildren();
for (const file of input.files) {
const li = document.createElement('li');
// textContent statt innerHTML: Dateinamen sind Benutzereingaben
li.textContent = `${file.webkitRelativePath} (${file.size} Bytes)`;
liste.append(li);
}
console.log(`${input.files.length} Dateien gefunden`);
});
Ordner hochladen und dabei die Pfade erhalten
const input = document.querySelector('#ordner');
input.webkitdirectory = true;
input.addEventListener('change', async () => {
const formData = new FormData();
for (const file of input.files) {
// Dritter Parameter: Dateiname inkl. Unterordner-Pfad
formData.append('dateien', file, file.webkitRelativePath);
}
const response = await fetch('/upload', { method: 'POST', body: formData });
console.log('Upload-Status:', response.status);
});
Dateien nach Unterordner gruppieren
const gruppiereNachOrdner = (files) => {
const gruppen = new Map();
for (const file of files) {
const teile = file.webkitRelativePath.split('/');
const ordner = teile.slice(0, -1).join('/');
if (!gruppen.has(ordner)) gruppen.set(ordner, []);
gruppen.get(ordner).push(file.name);
}
return gruppen;
};
document.querySelector('#ordner').addEventListener('change', (e) => {
console.log(Object.fromEntries(gruppiereNachOrdner(e.target.files)));
});
// Wichtig · Fallstricke
- Nicht standardisiert, aber weit verbreitet: Trotz des
webkit-Präfixes unterstützen Chrome, Edge, Firefox und Safari die Eigenschaft auf dem Desktop. Auf Mobilgeräten ist die Unterstützung eingeschränkt oder fehlt ganz, zum Beispiel unter iOS. Vorher mit'webkitdirectory' in inputprüfen. - Leere Ordner fehlen:
input.filesenthält nur Dateien. Leere Unterverzeichnisse lassen sich so nicht erkennen. - Leistung: Bei großen Ordnern, etwa mit
node_modules, kannfilesZehntausende Einträge enthalten. Den Upload filtern oder in kleinen Teilen verarbeiten. - Kein Filtern nach Dateityp: Das Attribut
acceptwird zusammen mitwebkitdirectorymeist ignoriert. Nach Dateiendung oder MIME-Typ selbst filtern. - Nur ein Ordner: Pro Auswahl wird ein Verzeichnis gewählt.
multiplehat hier je nach Browser keine oder keine verlässliche Wirkung. - Sicherheit: Dateinamen und Pfade kommen vom Benutzer. Sie nie per
innerHTMLausgeben (XSS-Gefahr). Auf dem ServerwebkitRelativePathauf Path-Traversal wie../prüfen. Browser zeigen vor dem Hochladen eines Ordners oft eine Bestätigung an. - Alternativen: Für Drag & Drop gibt es
DataTransferItem.webkitGetAsEntry(). Für Lese- und Schreibzugriff auf Ordner gibt eswindow.showDirectoryPicker()aus der File System Access API, bisher nur in Chromium-Browsern.