File Upload HTML
Datei auswählen, benennen, senden
Dateifeld, Entfernen-Symbol, Absenden: drei Stellen im Upload-Formular.
Upload als Transportweg
Was zwischen Dateifeld und Server wirklich passiert
Das HTML wählt eine Datei aus. multipart/form-data verpackt sie. Erst der Server entscheidet, ob sie angenommen wird.
Der Weg von zeugnis.pdf
Vier Stationen, eine überprüfbare Übergabe
accept hilft bei der Auswahl. Es prüft die Datei nicht verlässlich.
Die Boundary trennt Felder und Dateiinhalt innerhalb derselben Anfrage.
XMLHttpRequest.upload liefert geladene und gesamte Bytes.
Nur die Serverantwort bestätigt Erfolg oder nennt eine konkrete Korrektur.
Die Vertrauensgrenze
Der Browser hilft. Der Server entscheidet.
label gibt dem Feld einen Namenaccept grenzt den Dateidialog einGröße kann für schnelles Feedback geprüft werdenmultipart/form-dataKopierbare Grundlage
Formular und Fortschritt bleiben getrennte Schichten
Das Formular funktioniert ohne Skript. JavaScript ergänzt Fortschritt und direkte Rückmeldung; die Serverprüfung bleibt in beiden Fällen gleich.
<form id="bewerbung" action="/bewerbung"
method="post" enctype="multipart/form-data">
<label for="zeugnis">Zeugnis (PDF)</label>
<input id="zeugnis" name="zeugnis" type="file"
accept=".pdf,application/pdf" required
aria-describedby="zeugnis-hinweis">
<p id="zeugnis-hinweis">
PDF, höchstens 10 MB.
</p>
<label for="fortschritt">
Upload-Fortschritt: <span id="prozent">0 %</span>
</label>
<progress id="fortschritt" value="0" max="100">
0 %
</progress>
<p id="upload-status" role="status"></p>
<button type="submit">Zeugnis senden</button>
</form>const form = document.querySelector('#bewerbung');
const field = document.querySelector('#zeugnis');
const bar = document.querySelector('#fortschritt');
const percent = document.querySelector('#prozent');
const status = document.querySelector('#upload-status');
form.addEventListener('submit', event => {
event.preventDefault();
const file = field.files[0];
if (!file) return;
if (file.size > 10 * 1024 * 1024) {
field.setAttribute('aria-invalid', 'true');
status.textContent = 'Datei zu groß. Wählen Sie bis 10 MB.';
field.focus();
return;
}
field.removeAttribute('aria-invalid');
const request = new XMLHttpRequest();
request.upload.addEventListener('progress', event => {
if (!event.lengthComputable) return;
const value = Math.round(event.loaded / event.total * 100);
bar.value = value;
percent.textContent = value + ' %';
});
request.addEventListener('load', () => {
status.textContent = request.status >= 200 &&
request.status < 300
? 'Zeugnis gesendet.'
: 'Upload fehlgeschlagen. Versuchen Sie es erneut.';
});
request.addEventListener('error', () => {
status.textContent = 'Netzwerkfehler. Versuchen Sie es erneut.';
});
request.open('POST', form.action);
request.send(new FormData(form));
});So prüfen Sie es
Testen Sie Auswahl, Transfer und Antwort getrennt
- Gehen Sie mit Tab zum Dateifeld. Name und Formathinweis werden gemeinsam angesagt.
- Wählen Sie eine erlaubte Datei. Der sichtbare Fortschritt muss den Transfer abbilden.
- Simulieren Sie Server- und Netzwerkfehler. Die Meldung nennt jeweils die nächste Handlung.
- Prüfen Sie serverseitig eine umbenannte oder falsch deklarierte Datei.
Aus dem Prüfbericht
Zwei Bedienelemente, zwei Befunde
Kritisch Das Dateifeld hat keinen Namen Regel label
Der gestaltete Knopf verdeckt das eigentliche Dateifeld. Ein label mit for gibt dem input type="file" seinen Namen zurück.
Kritisch Das Papierkorb-Symbol hat keinen Namen Regel button-name
Die Schaltfläche zum Entfernen der gewählten Datei zeigt nur ein Symbol. aria-label="Datei entfernen" nennt die Aktion.
Zum Mitnehmen
Das Upload-Formular, korrigiert
Zwei kleine Änderungen im HTML. Das Aussehen bleibt gleich.
Korrektur in 2 Schritten ansehen
Dem Dateifeld einen Namen geben
Ein label mit for wird zum Namen des Dateifelds. Filter, Feldname und Gestaltung bleiben unverändert.
KorrekturvergleichSchritt 1 · HTML Vorher
<span class="upload-hinweis">Zeugnis (PDF)</span> <input type="file" name="zeugnis" accept=".pdf">Nachher
<label for="zeugnis">Zeugnis (PDF)</label> <input id="zeugnis" type="file" name="zeugnis" accept=".pdf">Markierte Zeilen wurden geändert
So prüfen Sie es Klicken Sie auf „Zeugnis (PDF)“. Öffnet sich die Dateiauswahl, ist der Name verbunden.
Dem Entfernen-Symbol einen Namen geben
Das Symbol bleibt sichtbar und für Vorleseprogramme verborgen. aria-label liefert das Wort, das statt des Symbols vorgelesen wird.
KorrekturvergleichSchritt 2 · HTML Vorher
<button type="button" class="datei-entfernen"> <svg aria-hidden="true"><use href="#icon-papierkorb"></use></svg> </button>Nachher
<button type="button" class="datei-entfernen" aria-label="Datei entfernen"> <svg aria-hidden="true"><use href="#icon-papierkorb"></use></svg> </button>Markierte Zeilen wurden geändert
So prüfen Sie es Gehen Sie mit der Tabulatortaste auf das Symbol. Ein Vorleseprogramm sagt „Datei entfernen, Schaltfläche“.
