File Upload HTML

Datei auswählen, benennen, senden

Dateifeld, Entfernen-Symbol, Absenden: drei Stellen im Upload-Formular.

Website prüfen
Beispiel im Prüfbericht Markierter Befund
Markierter Befund · Kritisch · WCAG 4.1.2Regler ohne zugänglichen Namen

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.

Konzeptdarstellung

Der Weg von zeugnis.pdf

Vier Stationen, eine überprüfbare Übergabe

1
Auswahlim Browser

accept hilft bei der Auswahl. Es prüft die Datei nicht verlässlich.

2
Verpackungim Formular

Die Boundary trennt Felder und Dateiinhalt innerhalb derselben Anfrage.

3
Transferüber das Netz

XMLHttpRequest.upload liefert geladene und gesamte Bytes.

4
Entscheidungauf dem Server

Nur die Serverantwort bestätigt Erfolg oder nennt eine konkrete Korrektur.

Dateiname und gemeldeter MIME-Typ kommen vom Client. Behandeln Sie beides als Angabe, nicht als Beweis für den Inhalt.

Die Vertrauensgrenze

Der Browser hilft. Der Server entscheidet.

Vor dem Sendenlabel gibt dem Feld einen Namenaccept grenzt den Dateidialog einGröße kann für schnelles Feedback geprüft werden
POSTmultipart/form-data
Nach dem Sendenerlaubte Größe verbindlich prüfenTyp und tatsächlichen Inhalt prüfenDateinamen neu vergeben und sicher speichern

Kopierbare 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

  1. Gehen Sie mit Tab zum Dateifeld. Name und Formathinweis werden gemeinsam angesagt.
  2. Wählen Sie eine erlaubte Datei. Der sichtbare Fortschritt muss den Transfer abbilden.
  3. Simulieren Sie Server- und Netzwerkfehler. Die Meldung nennt jeweils die nächste Handlung.
  4. Prüfen Sie serverseitig eine umbenannte oder falsch deklarierte Datei.

Aus dem Prüfbericht

Zwei Bedienelemente, zwei Befunde

Zum Mitnehmen

Das Upload-Formular, korrigiert

Zwei kleine Änderungen im HTML. Das Aussehen bleibt gleich.

Korrektur in 2 Schritten ansehen
  1. 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.

  2. 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“.

Werbung

Kostenloser Website-Barrierefreiheits-Check

Website auf Barrierefreiheit prüfen.

Technische WCAG-Warnsignale erkennen. Kritische Stellen zuerst prüfen.

Der Website-Check ist bereit.

Werbung

Ein letzter Schritt

Prüfen, bevor Sie gehen.

Finden Sie automatisch erkennbare Barrieren auf Ihrer eigenen Website.

Website prüfen

Kostenlos starten · keine Installation

Automatisches Screening. Tastaturbedienung und Screenreader bleiben manuelle Prüfung.