Signatur
Beschreibung
Die Eigenschaft enctype eines <form>-Elements legt fest, wie die Formulardaten beim Absenden kodiert werden. Sie spiegelt das HTML-Attribut enctype wider und ist lesbar und beschreibbar. Die Kodierung spielt nur bei method="post" eine Rolle, weil bei GET die Daten immer als Query-String an die URL angehängt werden.
Erlaubt sind drei Werte:
application/x-www-form-urlencoded: der Standardwert. Schlüssel-Wert-Paare werden URL-kodiert, zum Beispielname=Max&alter=30.multipart/form-data: Pflicht, sobald das Formular Dateien über<input type="file">hochlädt.text/plain: ungenormte Klartext-Kodierung. Sie ist nur für Debugging gedacht und lässt sich maschinell nicht zuverlässig auslesen.
Beim Lesen gibt die Eigenschaft immer einen gültigen Wert zurück. Fehlt das Attribut oder enthält es einen ungültigen Wert, erhält man "application/x-www-form-urlencoded". Ein Absende-Button kann den Wert mit dem Attribut formenctype für einen einzelnen Absendevorgang überschreiben.
Die Eigenschaft HTMLFormElement.encoding ist ein älterer Alias und verhält sich genauso.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value | string | "application/x-www-form-urlencoded" | Nur beim Setzen: der neue MIME-Typ. Gültig sind application/x-www-form-urlencoded, multipart/form-data und text/plain. Groß- und Kleinschreibung spielt keine Rolle. |
Rückgabewert
"application/x-www-form-urlencoded" zurückgegeben.Beispiele
Kodierungstyp auslesen
// <form id="kontakt" method="post" action="/senden"></form>
const form = document.getElementById('kontakt');
console.log(form.enctype);
// Ungültiger Wert fällt auf den Standardwert zurück
form.setAttribute('enctype', 'application/json');
console.log(form.enctype);
Für den Datei-Upload auf multipart umschalten
const form = document.querySelector('#profil');
const fileInput = form.querySelector('input[type="file"]');
fileInput.addEventListener('change', () => {
// Sobald eine Datei gewählt ist, muss multipart verwendet werden
if (fileInput.files.length > 0) {
form.method = 'post';
form.enctype = 'multipart/form-data';
}
console.log(form.enctype, form.getAttribute('enctype'));
});
enctype beim Absenden per fetch berücksichtigen
const form = document.querySelector('form');
form.addEventListener('submit', async (event) => {
event.preventDefault();
// Liefert den Button-Override (formenctype) oder form.enctype
const enctype = event.submitter?.formEnctype || form.enctype;
const data = new FormData(form, event.submitter);
// multipart: FormData direkt senden, Browser setzt Content-Type samt boundary
const body = enctype === 'multipart/form-data'
? data
: new URLSearchParams(data);
const response = await fetch(form.action, { method: 'POST', body });
console.log(enctype, response.status);
});
// Wichtig · Fallstricke
- Datei-Uploads: Ohne
multipart/form-datawird bei<input type="file">nur der Dateiname übertragen, nicht der Inhalt der Datei. Dieser Fehler passiert oft. - Nur bei POST wirksam: Bei
method="get"wirdenctypeignoriert. - Kein JSON:
application/jsonist kein gültiger Wert und fällt stillschweigend auf den Standardwert zurück. JSON sendet man stattdessen mitfetch()undJSON.stringify(). - Override durch Buttons:
formenctypeam Absende-Button hat Vorrang.form.enctypezeigt diesen Override nicht an. Den tatsächlich verwendeten Wert findet man überevent.submitterheraus. - fetch mit FormData: Den Header
Content-Type: multipart/form-datanicht selbst setzen. Sonst fehlt derboundary-Parameter, und der Server kann die Daten nicht auslesen. - text/plain: Diese Kodierung ist nicht eindeutig und kann bei Cross-Origin-Anfragen CSRF-Angriffe begünstigen, weil sie als „einfache Anfrage“ ohne CORS-Vorabprüfung (Preflight) verschickt wird. In Produktivsystemen nicht verwenden.
- Die Eigenschaft wird von allen Browsern unterstützt, auch von sehr alten.