Que signifie enctype='multipart/form-data' ?

Que signifie "enctype='multipart/form-data'dans un formulaire HTML et quand faut-il l'utiliser ?

Solution

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)
  • Multipart/form-data
  • 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 :

  • Ne jamais utiliser text/plain.

Lorsque vous écrivez du code côté client :

  • utilisez multipart/form-data lorsque votre formulaire comprend des éléments <input type="file">.
  • Sinon, vous pouvez utiliser multipart/form-data ou application/x-www-form-urlencoded mais application/x-www-form-urlencoded sera plus efficace.

Lorsque vous écrivez du code côté serveur :

  • Utilisez une bibliothèque de gestion des formulaires pré-écrite

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

Commentaires (5)

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.

Commentaires (5)

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 ou GET 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éthode POST. 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 :

Lorsque la valeur de l'attribut method est post, enctype est le type de contenu MIME du contenu qui est utilisé pour soumettre le formulaire au serveur.

  • 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) :

Tous les logiciels de traitement de formulaires doivent traiter les données de formulaire fournies par l'utilisateur l'utilisateur, car elles contiennent souvent des informations confidentielles ou des d'identification. L'utilisation de fonctions de "remplissage automatique" de formulaires dans les navigateurs Web est très répandue. de formulaires dans les navigateurs Web ; elles peuvent être utilisées pour inciter les utilisateurs à envoyer, sans le savoir, des informations confidentielles lorsqu'ils remplissent un formulaire. les utilisateurs à envoyer, sans le savoir, des informations confidentielles lorsqu'ils effectuent des tâches > anodines. inoffensifs. multipart/form-data ne fournit pas de fonctions permettant de vérifier l'intégrité, d'assurer la confidentialité ou de protéger les données personnelles. pour vérifier l'intégrité, assurer la confidentialité, éviter la confusion des d'éviter la confusion de l'utilisateur ou d'autres caractéristiques de sécurité. Ces problèmes doivent être résolus par les applications de remplissage de formulaires et d'interprétation de données de formulaires.

Les applications qui reçoivent des formulaires et les traitent doivent veiller à ne pas renvoyer de données au système d'information. Les applications qui reçoivent des formulaires et les traitent doivent veiller à ne pas renvoyer au site de traitement du formulaire demandeur des données qui n'étaient pas destinées à être envoyées. qui n'étaient pas destinées à être envoyées.

Il est important, lorsque l'on interprète le nom de fichier du champ d'en-tête Content- Il est important, lors de l'interprétation du nom de fichier du champ d'en-tête Content- > Disposition, de ne pas écraser par inadvertance des fichiers dans l'espace fichier du destinataire. Il est important, lors de l'interprétation du nom de fichier du champ d'en-tête Content- > Disposition, de ne pas écraser par inadvertance des fichiers dans l'espace fichier du destinataire.

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

Commentaires (1)