LISEZ AU MOINS LE PREMIER PARAGRAPHE ICI !
Je sais que c'est 3 ans trop tard, mais la réponse (acceptée) de Matt est incomplète et finira par vous attirer des ennuis. La clé ici est que, si vous choisissez d'utiliser multipart/form-data
la frontière doit no apparaissent dans les données du fichier que le serveur reçoit finalement.
Ce n'est pas un problème pour application/x-www-form-urlencoded
parce qu'il n'y a pas de frontière. x-www-form-urlencoded
peut aussi toujours traiter des données binaires, en transformant simplement un octet arbitraire en trois 7BIT
octets. C'est inefficace, mais cela fonctionne (et notez que le commentaire concernant l'impossibilité d'envoyer des noms de fichiers ainsi que des données binaires est incorrect ; vous les envoyez simplement comme une autre paire clé/valeur).
Le problème avec multipart/form-data
est que le séparateur de frontières ne doit pas être présent dans les données du fichier (cf. RFC 2388 ; la section 5.2 comprend également une excuse plutôt boiteuse pour ne pas avoir un type MIME agrégé approprié qui évite ce problème).
Donc, à première vue, multipart/form-data
n'a aucune valeur dans tout le téléchargement de fichiers, binaires ou autres. Si vous ne choisissez pas correctement votre frontière, alors vous sera Le serveur trouvera une limite au mauvais endroit, et votre fichier sera tronqué, ou le POST échouera.
La clé est de choisir un encodage et une frontière tels que les caractères de frontière que vous avez sélectionnés ne puissent pas apparaître dans la sortie encodée. Une solution simple consiste à utiliser base64
(faire no utiliser le binaire brut). Sur base64 3 octets arbitraires sont codés en quatre caractères de 7 bits, le jeu de caractères de sortie étant le suivant [A-Za-z0-9+/=]
(c'est-à-dire les caractères alphanumériques, '+', '/' ou '='). =
est un cas particulier, et ne peut apparaître qu'à la fin de la sortie codée, sous la forme d'un seul fichier =
ou un double ==
. Maintenant, choisissez votre limite comme une chaîne ASCII de 7 bits qui ne peut pas apparaître dans base64
sortie. De nombreux choix que vous voyez sur le net échouent à ce test - les formulaires MDN docs Par exemple, l'utilisation de "blob" comme limite pour l'envoi de données binaires n'est pas une bonne chose. Cependant, quelque chose comme "!blob !" n'apparaîtra jamais dans les fichiers base64
sortie.
90 votes
Il convient de préciser que ce sont les deux types MIME utilisés par les formulaires HTML. HTTP lui-même n'a aucune limitation de ce type... on peut utiliser le type MIME que l'on veut via HTTP.