Signatur
Beschreibung
DataTransfer.files gibt eine FileList zurück, die alle Dateien enthält, die der Nutzer per Drag-and-Drop auf die Seite gezogen oder über die Zwischenablage eingefügt hat. Jeder Eintrag ist ein File-Objekt, das du mit FileReader, file.text(), file.arrayBuffer() oder per FormData weiterverarbeiten kannst.
Typische Einsatzorte sind Upload-Dropzones (im drop-Event über event.dataTransfer.files) und das Einfügen von Bildern aus der Zwischenablage (im paste-Event über event.clipboardData.files). Enthält die Operation keine Dateien, ist die Liste leer (length === 0).
Wichtig: Aus Sicherheitsgründen ist der Inhalt nur im drop-Event (bzw. paste) lesbar. In dragenter, dragover und dragleave befindet sich der Datenspeicher im geschützten Modus – files ist dort leer. Um schon beim Ziehen zu prüfen, ob Dateien dabei sind, nutzt man dataTransfer.types.includes("Files").
Die FileList ist kein echtes Array. Für map, filter usw. wandelt man sie mit Array.from() oder dem Spread-Operator um; for...of funktioniert direkt.
Rückgabewert
FileList mit den File-Objekten der Operation. Leer, wenn keine Dateien übertragen werden oder der Zugriff außerhalb von drop/paste erfolgt.Beispiele
Einfache Dropzone für Datei-Uploads
const dropzone = document.querySelector('#dropzone');
// dragover muss verhindert werden, sonst ist drop nicht möglich
dropzone.addEventListener('dragover', (event) => {
event.preventDefault();
event.dataTransfer.dropEffect = 'copy';
});
dropzone.addEventListener('drop', (event) => {
event.preventDefault(); // verhindert, dass der Browser die Datei öffnet
const { files } = event.dataTransfer;
for (const file of files) {
console.log(`${file.name} – ${file.type || 'unbekannt'} – ${file.size} Bytes`);
}
});
Gedroppte Bilder filtern und hochladen
const dropzone = document.querySelector('#dropzone');
dropzone.addEventListener('dragover', (e) => e.preventDefault());
dropzone.addEventListener('drop', async (event) => {
event.preventDefault();
const images = Array.from(event.dataTransfer.files)
.filter((file) => file.type.startsWith('image/'));
if (images.length === 0) {
console.warn('Keine Bilder gefunden');
return;
}
const formData = new FormData();
images.forEach((img) => formData.append('images[]', img, img.name));
const response = await fetch('/api/upload', { method: 'POST', body: formData });
console.log('Upload-Status:', response.status);
});
Screenshot aus der Zwischenablage einfügen
document.addEventListener('paste', async (event) => {
const [file] = event.clipboardData.files;
if (!file || !file.type.startsWith('image/')) return;
const url = URL.createObjectURL(file);
const img = document.createElement('img');
img.src = url;
img.onload = () => URL.revokeObjectURL(url);
document.body.append(img);
console.log('Bild eingefügt:', file.type);
});
Beim Ziehen prüfen, ob Dateien dabei sind
const dropzone = document.querySelector('#dropzone');
dropzone.addEventListener('dragenter', (event) => {
// files ist hier noch leer – daher types prüfen
const hasFiles = event.dataTransfer.types.includes('Files');
console.log('files.length:', event.dataTransfer.files.length, '| Dateien?', hasFiles);
dropzone.classList.toggle('is-active', hasFiles);
});
dropzone.addEventListener('dragleave', () => dropzone.classList.remove('is-active'));
// Wichtig · Fallstricke
- Nur im
drop-/paste-Event lesbar: Indragenter/dragoveristfilesimmer leer (geschützter Modus). Nutze dortdataTransfer.types.includes("Files"). preventDefault()nicht vergessen: OhnepreventDefault()indragoverwirddropgar nicht ausgelöst; ohnepreventDefault()indropöffnet der Browser die Datei und verlässt die Seite.- Ordner: Gezogene Verzeichnisse erscheinen als Eintrag mit
size0 bzw. leeremtypeund lassen sich nicht auslesen. Für OrdnerinhaltedataTransfer.itemsmitwebkitGetAsEntry()odergetAsFileSystemHandle()verwenden. - Kein Array:
FileListbesitzt keinmap/filter– vorherArray.from()nutzen. Die Liste ist zudem nur zum Zeitpunkt des Events gültig; bei asynchroner Verarbeitung dieFile-Objekte vorher in ein Array kopieren. - Sicherheit:
file.typewird aus der Dateiendung abgeleitet und ist nicht vertrauenswürdig. Dateityp und -größe immer serverseitig prüfen; Dateinamen niemals ungefiltert perinnerHTMLausgeben (XSS). - Kompatibilität: In allen modernen Browsern unterstützt. Auf Mobilgeräten ist Drag-and-Drop von Dateien nur eingeschränkt verfügbar (z. B. iPadOS) – immer ein
<input type="file">als Alternative anbieten.