LISEZ AU MOINS LE PREMIER PARA ICI!
Je sais que c'est 3 ans trop tard, mais la réponse (acceptée) de Matt est incomplète et vous causera éventuellement des ennuis. La clé ici est que, si vous choisissez d'utiliser multipart/form-data
, la frontière ne doit pas apparaître dans les données de fichier que le serveur reçoit finalement.
Ce n'est pas un problème pour application/x-www-form-urlencoded
, car il n'y a pas de frontière. x-www-form-urlencoded
peut également toujours gérer des données binaires, par le simple expédient de transformer un octet arbitraire en trois7BIT
octets. Inefficace, mais cela fonctionne (et notez que le commentaire sur l'impossibilité d'envoyer des noms de fichiers ainsi que des données binaires est incorrect; vous l'envoyez simplement comme une autre paire clé / valeur).
Le problème avec multipart/form-data
est que le séparateur de limites ne doit pas être présent dans les données du fichier (voir RFC 2388 ; la section 5.2 inclut également une excuse plutôt boiteuse pour ne pas avoir un type MIME agrégé correct qui évite ce problème).
Donc, à première vue, multipart/form-data
est sans valeur que ce soit dans tout transfert de fichiers, binaire ou autre. Si vous ne choisissez pas correctement votre frontière, vous aurez éventuellement un problème, que vous envoyiez du texte brut ou du binaire brut - le serveur trouvera une frontière au mauvais endroit et votre fichier sera tronqué, ou le POST échouera.
La clé est de choisir un encodage et une frontière de sorte que les caractères de frontière sélectionnés ne puissent pas apparaître dans la sortie encodée. Une solution simple consiste à utiliser base64
(ne pas utiliser de binaire brut). Dans base64, 3 octets arbitraires sont codés en quatre caractères de 7 bits, où le jeu de caractères de sortie est [A-Za-z0-9+/=]
(c'est-à-dire alphanumériques, '+', '/' ou '='). =
est un cas particulier et ne peut apparaître qu'à la fin de la sortie codée, en simple =
ou en double ==
. Maintenant, choisissez votre frontière comme une chaîne ASCII 7 bits qui ne peut pas apparaître dans la base64
sortie. De nombreux choix que vous voyez sur le net échouent à ce test - la documentation MDN Forms, par exemple, utilisez "blob" comme limite lors de l'envoi de données binaires - pas bon. Cependant, quelque chose comme "! Blob!" n'apparaîtra jamais en base64
sortie.