2009-08-27 5 views

Répondre

58

Cela a à voir avec la façon dont le navigateur conditionne les données binaires et les données de formulaire pour la transmission sur HTTP. Par défaut, seules les données de formulaire sont envoyées, mais si le formulaire doit prendre en charge le téléchargement d'un fichier, les données binaires doivent également être ajoutées et séparées des données du formulaire.

Scott Hanselman donne une bonne explication de cette here:

HTTP et comment File Upload fonctionne via HTTP

Il est toujours mieux, pour moi, de comprendre pourquoi et comment se passe quelque chose. Si vous dites «juste parce que» ou «peu importe, vous ajoutez simplement cela, et cela fonctionne» alors je pense que c'est triste. Pour une raison quelconque, alors que beaucoup de gens comprennent FORM POST et généralement comment les données de formulaire sont transmises au serveur, quand un fichier est transféré, beaucoup concluent que c'est magique. Pourquoi devons-nous ajouter enctype = "multipart/form = data" sur nos formulaires qui incluent des téléchargements de fichiers? Parce que le formulaire sera maintenant POSTed en plusieurs parties.

Si vous avez une forme comme ceci:

<form action="/home/uploadfiles" method="post" enctype="multipart/form-data"> 
    <label for="file">Filename:</label> 
    <input type="file" name="file" id="file" /> 
    <input type="submit" name="submit" value="Submit" /> 
</form> 

Le résultat formulaire POST ressemblera à ceci (un peu simplifié):

POST /home/uploadfiles HTTP/1.1 
Content-Type: multipart/form-data; boundary=---------------------------7d81b516112482 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64) 
Content-Length: 324 

-----------------------------7d81b516112482 
Content-Disposition: form-data; name="file"; filename="\\SERVER\Users\Scott\test.txt" 
Content-Type: text/plain 

foo 
-----------------------------7d81b516112482 
Content-Disposition: form-data; name="submit" 

Submit 
-----------------------------7d81b516112482-- 

Avis quelques choses à propos de ce POST. Tout d'abord, notez le type de contenu et la limite = "" et comment la limite est utilisée plus tard, exactement comme cela, une frontière entre les parties multiples. Voyez comment la première partie montre que j'ai téléchargé un seul fichier, de type text/plain. Vous pouvez interpoler à partir de là comment vous vous attendez à ce que plusieurs fichiers s'affichent s'ils ont tous été POSTÉS en même temps.

Et bien sûr, regardez comment différent cette ressemblerait si elle était juste une forme de base POST sans enctype = "multipart/form = données" inclus:

POST /home/uploadfiles HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
UA-CPU: x86 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64) 
Content-Length: 13 

submit=Submit 

Voyez comment la le type de contenu est différent? C'est un formulaire POST normal et typique. Peut-être atypique en ce qu'il comprend seulement un bouton Envoyer! En outre, si vous jetez un coup d'oeil sur un de vos courriels avec plusieurs fichiers attachés, cela ressemblerait beaucoup au corps du premier message HTTP car l'encodage MIME multipart se trouve partout, comme c'est souvent le cas avec la plupart des bonnes idées.

+0

pouvez-vous s'il vous plaît expliquer ce qui est des données binaires lorsque télécharger un fichier texte? Dites que je télécharge le fichier texte, pourquoi il peut être envoyé comme paramètre de requête dans le corps du message où le nom du paramètre peut être le nom du fichier et la valeur peut être le contenu du fichier? Fondamentalement Si je peux coller manuellement le contenu du fichier dans la zone de texte sur HTML/JSP qui est transféré au serveur en tant que paramètre normal de demande de publication qui l'a lu sur le côté serveur, alors pourquoi le téléchargement de fichier nécessite-t-il plusieurs parties? –

1

Cela fait partie de la spécification HTML File Upload tel que décrit dans RFC-1867, qui a été la proposition visant à permettre le téléchargement de fichiers dans les formulaires HTML (vers 1995).

de la section 2:

Cette proposition apporte deux modifications: HTML

1) Ajouter une option de fichier pour l'attribut type d'entrée.
2) Autoriser un attribut ACCEPT pour le tag INPUT, qui est une liste de types de média ou de types de types autorisés pour l'entrée.

En outre, il définit un nouveau type de support MIME, multipart/form-data, et précise le comportement des agents utilisateurs HTML lors de l'interprétation d'une forme
avec ENCTYPE="multipart/form-data" et/ou <INPUT type="file">
tags.

Lorsque vous définissez enctype-multipart/form-data, le navigateur sépare chaque fichier ou une pièce jointe dans le téléchargement avec une « limite multipart », qui est un identifiant unique qui définit le début et la fin de chaque « partie ».

Cela permet au navigateur d'envoyer plusieurs pièces (d'où le nom) dans une demande, et d'identifier chacun avec ses propres métadonnées comme type MIME, nom de fichier, etc.

Questions connexes