<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Drag and Drop</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto+Condensed&family=Roboto:ital,wght@0,400;0,500;1,400&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/css/styles.css">
<link rel="stylesheet" href="/css/formstyles.css">
<style>
#dropzone {
border: 2px dashed #ccc;
border-radius: 20px;
text-align: center;
background-color: white;
min-height: 236px;
padding: 20px 0 10px 0;
margin-bottom: 25px;
}
#dropzone.highlight {
border-color: purple;
background-color: #FFCBCB;
}
.preview_img {
height: 100%;
max-height: 120px;
width: auto;
margin: 25px auto 12px auto;
display: block;
}
</style>
</head>
<body>
<div id="container">
<h1>Drag and Drop</h1>
<h2>Progressive Enhancement im Einsatz</h2>
<p>Auf mobilen Geräten nützt "Drag and Drop" herzlich wenig. Deshalb empfehle ich dir, das <code><input type="file"></code> immer anzuzeigen, damit die Dateiwahl auch auf die "klassische" Art und Weise möglich ist.</p>
<p>Das Formular und das Verschicken funktioniert auch ohne JavaScript. Die Vorschau- und die "Drag and Drop"-Funktionalität dient zur <strong>Verbesserung der Usability</strong>, ersetzt aber nicht die Kernfunktionalität beim Verschicken.</p>
<p>Um das Beispiel im Code zu verstehen, solltest du die beiden einleitenden Themen "Vorschaubild" und "Drag Queens" bereits angeschaut haben.</p>
<form method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
<div id="dropzone">
<input type="file" accept="image/*" name="myFile" id="myFile">
</div>
<div class="form_control" style="text-align: center;">
<button type="submit" name="go" class="btn btn-blue" disabled>Upload (disabled)</button>
</div>
</form>
<script>
const inputElement = document.getElementById("myFile");
inputElement.addEventListener("change", handleFiles, false);
const dropzone = document.getElementById("dropzone");
dropzone.addEventListener('dragenter', highlightDropzone, false);
dropzone.addEventListener('dragover', highlightDropzone, false);
dropzone.addEventListener('dragleave', unhighlightDropzone, false);
dropzone.addEventListener('drop', dropFunction, false);
function highlightDropzone(event) {
dropzone.classList.add('highlight')
event.preventDefault();
event.stopPropagation();
}
function unhighlightDropzone(event) {
dropzone.classList.remove('highlight')
event.preventDefault();
event.stopPropagation();
}
function dropFunction(event) {
dropzone.classList.remove('highlight')
event.preventDefault();
event.stopPropagation();
if (event.dataTransfer.items.length > 1) {
alert("Sie können nur eine Datei auf's Mal hochladen");
}
else {
let mime = event.dataTransfer.items[0].type;
if (mime.startsWith("image/")) {
let dt = event.dataTransfer;
let filesFromTransfer = dt.files;
// Hier findet die "Übergabe" an das Upload-Form statt
inputElement.files = filesFromTransfer;
handleFiles();
}
else {
alert("Unerlaubter Dateityp, bitte wählen Sie ein Bild aus");
}
}
}
function handleFiles() {
const fileList = inputElement.files;
// Theoretisch ginge auch eine Vorschau von mehreren Bildern,
// wir behandeln nur den Upload von EINEM Bild
const myFile = fileList[0];
if (myFile.type.startsWith("image/")) {
const previewImg = document.createElement("img");
previewImg.classList.add("preview_img");
previewImg.file = myFile;
dropzone.append(previewImg);
const legend = document.createElement("p");
legendText = document.createTextNode("Dateigrösse: " + myFile.size + " Bytes");
legend.appendChild(legendText);
dropzone.append(legend);
const reader = new FileReader();
reader.onload = (e) => {
previewImg.src = e.target.result;
};
reader.readAsDataURL(myFile);
}
else {
alert("Unerlaubter Dateityp, bitte wählen Sie ein Bild aus");
}
}
</script>
</body>
</html>