Que signifie enctype='multipart/form-data'
dans un formulaire HTML et quand devrions-nous l'utiliser?
@Quentin Excusez-moi, quel serait le problème probable si nous utilisons multipart pour tous les formulaires? avec et sans fichiers.
Que signifie enctype='multipart/form-data'
dans un formulaire HTML et quand devrions-nous l'utiliser?
Lorsque vous effectuez une requête POST, vous devez encoder les données qui forment le corps de la requête d'une certaine manière.
Les formulaires HTML fournissent trois méthodes d'encodage.
application/x-www-form-urlencoded
(par défaut)multipart/form-data
text/plain
Des travaux étaient en cours pour ajouter application/json
, mais cela a été abandonné.
(D'autres encodages sont possibles avec les requêtes HTTP générées en utilisant d'autres moyens qu'une soumission de formulaire HTML. JSON est un format courant pour une utilisation avec les services web et certains continuent d'utiliser SOAP.)
Les détails des formats n'ont pas d'importance pour la plupart des développeurs. Les points importants sont :
text/plain
.Lorsque vous écrivez du code côté client :
multipart/form-data
lorsque votre formulaire inclut des éléments multipart/form-data
ou application/x-www-form-urlencoded
mais application/x-www-form-urlencoded
sera plus efficaceLorsque vous écrivez du code côté serveur :
La plupart (comme le CGI->param
de Perl ou celui exposé par le superglobale $_POST
de PHP) se chargeront des différences pour vous. Ne vous embêtez pas à essayer 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 qui recommande dans sa documentation des alternatives qui le peuvent).
Si vous écrivez (ou déboguez) une bibliothèque pour l'analyse ou la génération des données brutes, alors vous devez commencer à vous soucier du format. Vous voudrez peut-être également en savoir plus 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 significativement 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.
text/plain
est introduit par HTML 5 et est utile uniquement pour le débogage — dans la spécification: Ils ne sont pas interprétables de manière fiable par un ordinateur — et je soutiendrais que les autres combinés avec des outils (comme le panneau Réseau dans les outils de développement de la plupart des navigateurs) sont meilleurs pour cela).
@Quentin Excusez-moi, quel serait le problème probable si nous utilisons multipart pour tous les formulaires? avec et sans fichiers.
@Quentin est-ce que les données de formulaire multipart sont envoyées en tant que flux par défaut?
enctype='multipart/form-data
est un type d'encodage qui permet d'envoyer des fichiers via une méthode POST. Tout simplement, sans cet encodage, les fichiers ne peuvent pas être envoyés via POST.
Si vous voulez permettre à un utilisateur de télécharger un fichier via un formulaire, vous devez utiliser cet enctype.
De ce que je comprends, vous pouvez utiliser multipart/form-data
pour l'envoi de fichiers non binaires mais c'est inefficace. Je crois que l'utilisation de application/x-www-form-urlencoded
est la bonne façon d'envoyer des données non binaires mais quelqu'un avec plus d'expérience avec les fichiers non binaires pourrait avoir besoin de me corriger.
Le principal avantage d'utiliser multipart/form-data
pour l'envoi d'un fichier est qu'il fonctionnera automatiquement à la fois côté frontend et backend. Vous n'avez pas à effectuer de manipulation spéciale. Tous les fichiers sont binaires même s'ils ne doivent contenir que du texte. application/x-www-form-urlencoded
est la façon standard de POSTer un formulaire sans fichiers attachés. multipart/form-data
est la façon standard de POSTer un formulaire avec des fichiers attachés. (Il existe également de nombreux autres encodages, tels que application/json
et application/json-patch+json
, qui sont courants pour la communication entre le serveur et le client.)
Lors de la soumission d'un formulaire, vous indiquez à votre navigateur d'envoyer, via le protocole HTTP, un message sur le réseau, correctement enveloppé dans une structure de message de protocole TCP/IP. Une page HTML a un moyen d'envoyer des données au serveur: en utilisant des
s.
Lorsqu'un formulaire est soumis, une requête HTTP est créée et envoyée au serveur, le message contiendra les noms de champs du formulaire et les valeurs remplies par l'utilisateur. Cette transmission peut se faire avec les méthodes HTTP POST
ou GET
.
POST
indique à votre navigateur de construire un message HTTP et de mettre tout le contenu dans le corps du message (une manière très utile de faire les choses, plus sûre et aussi flexible).GET
soumettra les données du formulaire dans la querystring. Il y a certaines contraintes concernant la représentation et la longueur des données.L'attribut enctype
a du sens uniquement lors de l'utilisation de la méthode POST
. Lorsqu'il est spécifié, il indique au navigateur d'envoyer le formulaire en encodant son contenu d'une manière spécifique. Depuis MDN - Enctype du formulaire:
Lorsque la valeur de l'attribut method est post, enctype est le type MIME du contenu qui est utilisé pour soumettre le formulaire au serveur.
application/x-www-form-urlencoded
: C'est le défaut. Lorsque le formulaire est envoyé, tous les noms et les valeurs sont collectés et codage URL est effectué sur la chaîne finale.multipart/form-data
: Les caractères ne sont PAS encodés. C'est important lorsque le formulaire contient un contrôle de téléchargement de fichier. Vous voulez envoyer le fichier en binaire et cela garantit que le flux de bits n'est pas altéré.text/plain
: Les espaces sont convertis, mais aucun encodage supplémentaire n'est effectué.Lors de la soumission de formulaires, certaines préoccupations de sécurité peuvent survenir comme indiqué dans RFC 7578 Section 7: Données de formulaire multipart - Considérations de sécurité:
Tout logiciel de traitement de formulaire doit traiter les données de formulaire fournies par l'utilisateur avec sensibilité, car elles contiennent souvent des informations confidentielles ou personnellement identifiables. Il y a une utilisation généralisée des fonctionnalités de "remplissage automatique" de formulaires dans les navigateurs web; celles-ci pourraient être utilisées pour tromper les utilisateurs en envoyant involontairement des informations confidentielles lors de l'achèvement de tâches autrement innocentes. multipart/form-data ne fournit pas de fonctionnalités pour vérifier l'intégrité, garantir la confidentialité, éviter la confusion des utilisateurs, ou d'autres fonctionnalités de sécurité; ces préoccupations doivent être abordées par les applications de remplissage de formulaire et d'interprétation de données de formulaire.
Les applications qui reçoivent des formulaires et les traitent doivent faire attention de ne pas renvoyer des données au site de traitement de formulaire demandeur qui n'étaient pas destinées à être envoyées.
Il est important lors de l'interprétation du nom de fichier du champ d'en-tête Content-Disposition de ne pas écraser accidentellement des fichiers dans l'espace de fichiers du destinataire.
Ceci vous concerne si vous êtes un développeur et que votre serveur traitera des formulaires soumis par des utilisateurs qui pourraient contenir des informations sensibles.
Le contenu concernant la sécurité après la dernière modification est totalement hors sujet par rapport à la question de ce que les enctype
font. Je sais que c'est littéralement issu de la RFC multipart/form-data
, mais néanmoins, c'est un déversement arbitraire de considérations de sécurité concernant la soumission de formulaires qui sont entièrement orthogonales à la question de savoir si les données sont envoyées en tant que application/x-www-form-urlencoded
ou multipart/form-data
.
Définissez l'attribut method sur POST car le contenu du fichier ne peut être mis à l'intérieur d'un paramètre d'URL à l'aide d'un formulaire.
Définissez la valeur de l'enctype sur multipart/form-data car les données seront divisées en plusieurs parties, une pour chaque fichier plus une pour le texte du corps du formulaire qui peut être envoyé avec eux.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
4 votes
w3.org/html/wg/spec/…
0 votes
C'est pour POSTer des fichiers entiers dans le cadre de l'envoi de formulaire. Je pensais que cela aurait quelque chose à voir avec plusieurs parties de l'entrée de formulaire texte, mais ce n'est pas le cas, c'est juste pour les téléversements de fichiers.
0 votes
Je préfère les "guillemets doubles" en HTML