Détails
Que signifie enctype='multipart/form-data' ?
Que signifie "enctype='multipart/form-data'dans un formulaire HTML et quand faut-il l'utiliser ?
1281
3
Lorsque vous effectuez une requête POST, vous devez coder d'une manière ou d'une autre les données qui constituent le corps de la requête.
Les formulaires HTML proposent trois méthodes d'encodage.
application/x-www-form-urlencoded
(par défaut)text/plain
L'ajout de [
application/json
] (http://www.w3.org/TR/html-json-forms/) était en cours, mais a été abandonné.(D'autres codages sont possibles avec les requêtes HTTP générées par d'autres moyens qu'une soumission de formulaire HTML).
Les spécificités des formats n'ont pas d'importance pour la plupart des développeurs. Les points importants sont les suivants :
text/plain
.Lorsque vous écrivez du code côté client :
multipart/form-data
lorsque votre formulaire comprend des éléments<input type="file">
.multipart/form-data
ouapplication/x-www-form-urlencoded
maisapplication/x-www-form-urlencoded
sera plus efficace.Lorsque vous écrivez du code côté serveur :
La plupart (comme
CGI->param
de Perl ou celle exposée par la superglobale$_POST
de PHP) s'occuperont des différences pour vous. N'essayez pas d'analyser l'entrée brute reçue par le serveur.Parfois, vous trouverez une bibliothèque qui ne peut pas gérer les deux formats. La bibliothèque la plus populaire de Node.js pour la gestion des données de formulaire est body-parser qui ne peut pas gérer les requêtes multipart (mais a une documentation qui recommande quelques alternatives qui le peuvent).
Si vous écrivez (ou déboguez) une bibliothèque pour analyser ou générer les données brutes, vous devez commencer à vous soucier du format. Vous pouvez également vouloir le connaître par intérêt.
application/x-www-form-urlencoded
est plus ou moins la même chose qu'une chaîne de requête à la fin de l'URL.multipart/form-data
est nettement plus compliqué mais il permet d'inclure des fichiers entiers dans les données. Un exemple du résultat peut être trouvé dans la [spécification HTML 4] (http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4).text/plain
est introduit par HTML 5 et n'est utile que pour le débogage - d'après [la spécification][1] : Ils ne sont pas interprétables de manière fiable par un ordinateur - et je dirais que les autres combinés avec des outils (comme l'onglet Net dans les outils de développement de la plupart des navigateurs) sont meilleurs pour cela).[1] : http://www.w3.org/TR/html5/forms.html#text/plain-encoding-algorithm
enctype='multipart/form-data
est un type d'encodage qui permet d'envoyer des fichiers via un POST. En clair, sans cet encodage, les fichiers ne peuvent pas être envoyés par POST.Si vous voulez permettre à un utilisateur de télécharger un fichier via un formulaire, vous devez utiliser ce enctype.
En soumettant un formulaire, vous demandez à votre navigateur d'envoyer, via le protocole HTTP, un message sur le réseau, correctement enveloppé dans une structure de message du protocole TCP/IP. Une page HTML a un moyen d'envoyer des données au serveur : en utilisant des ``s.
Quand un formulaire est soumis, une requête HTTP est créée et envoyée au serveur, le message contiendra les noms des champs du formulaire et les valeurs remplies par l'utilisateur. Cette transmission peut se faire avec les méthodes
POST
ouGET
HTTP.POST
indique à votre navigateur de construire un message HTTP et de mettre tout le contenu dans le corps du message (une façon très utile de faire les choses, plus sûre et aussi plus flexible).GET
soumet les données du formulaire dans la chaîne de requête. Elle a quelques contraintes concernant la représentation et la longueur des données.Indiquer comment envoyer votre formulaire au serveur
L'attribut
enctype
n'a de sens que lorsqu'on utilise la méthodePOST
. Lorsqu'il est spécifié, il indique au navigateur d'envoyer le formulaire en codant son contenu d'une manière spécifique. Extrait de MDN - Form enctype :application/x-www-form-urlencoded
: Il s'agit de la valeur par défaut. Lorsque le formulaire est envoyé, tous les noms et valeurs sont collectés et URL Encoding est exécuté sur la chaîne finale.multipart/form-data
: Les caractères ne sont PAS encodés. C'est important lorsque le formulaire comporte un contrôle de téléchargement de fichier. Vous voulez envoyer le fichier en binaire et cela garantit que le flux binaire n'est pas altéré.text/plain
: Les espaces sont convertis, mais aucun autre encodage n'est effectué.Sécurité
Lors de la soumission de formulaires, certains problèmes de sécurité peuvent survenir, comme indiqué dans [RFC 7578 Section 7 : Multipart form data - Security considerations] (https://tools.ietf.org/html/rfc7578#section-7) :
Cela vous concerne si vous êtes un développeur et que votre serveur traite des formulaires soumis par des utilisateurs qui pourraient contenir des informations sensibles.
[1] : http://www.w3.org/TR/html401/interact/forms.html