1812 votes

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

Que signifie enctype='multipart/form-data' dans un formulaire HTML et quand devrions-nous l'utiliser?

4 votes

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

1968voto

Quentin Points 325526

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 :

  • Ne jamais utiliser text/plain.

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

  • utilisez multipart/form-data lorsque votre formulaire inclut des éléments
  • 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 de formulaires préécrite

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).

8 votes

@Quentin Excusez-moi, quel serait le problème probable si nous utilisons multipart pour tous les formulaires? avec et sans fichiers.

25 votes

Il n'est pas logique pour les formulaires GET, et cela augmente la taille des requêtes.

0 votes

@Quentin est-ce que les données de formulaire multipart sont envoyées en tant que flux par défaut?

108voto

Matt Asbury Points 3768

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.

0 votes

Donc.. si le fichier n'est pas un fichier binaire, pouvons-nous travailler sans cela ?

0 votes

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.

16 votes

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.)

96voto

Andry Points 3390

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.

Indiquer comment envoyer votre formulaire au serveur

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é.

Sécurité

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.

4 votes

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.

53voto

GP Singh Points 101

enctype='multipart/form-data' signifie qu'aucun caractère ne sera encodé. C'est pourquoi ce type est utilisé lors du téléchargement de fichiers sur le serveur.
Donc multipart/form-data est utilisé lorsqu'un formulaire nécessite des données binaires, comme le contenu d'un fichier, à télécharger

11voto

sandy Points 45

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.

0 votes

Cela implique que POST est probablement suffisant pour soumettre un fichier via un formulaire et ajouter multipart/form-data est simplement un bonus d'une manière vague. Ce n'est pas le cas. La plupart des fichiers nécessiteront absolument l'utilisation de multipart/form-data.

Prograide.com

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.

Powered by:

X