Exemple de multipart / form-data


103

Je me demande si quelqu'un peut partager avec moi un exemple de multipart / form-data qui contient:

  1. Quelques paramètres de formulaire
  2. Plusieurs fichiers

2
Allez ici: w3.org/TR/html401/interact/forms.html#h-17.13.4 Dans 17.13.4 Form content typesvous trouverez ce que vous cherchez.
Andrew Barber



Le téléchargement en plusieurs parties télécharge de gros fichiers par morceaux. Le téléchargement multifichier télécharge de nombreux petits fichiers. Que demandez-vous?
Gangnus

Réponses:


126

EDIT : Je maintiens une réponse similaire, mais plus approfondie sur: https://stackoverflow.com/a/28380690/895245

Pour voir exactement ce qui se passe, utilisez nc -lou un serveur ECHO et un agent utilisateur comme un navigateur ou cURL.

Enregistrez le formulaire dans un .htmlfichier:

<form action="http://localhost:8000" method="post" enctype="multipart/form-data">
  <p><input type="text" name="text" value="text default">
  <p><input type="file" name="file1">
  <p><input type="file" name="file2">
  <p><button type="submit">Submit</button>
</form>

Créez des fichiers à télécharger:

echo 'Content of a.txt.' > a.txt
echo '<!DOCTYPE html><title>Content of a.html.</title>' > a.html

Courir:

nc -l localhost 8000

Ouvrez le HTML sur votre navigateur, sélectionnez les fichiers et cliquez sur soumettre et vérifiez le terminal.

ncimprime la demande reçue. Firefox a envoyé:

POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: __atuvc=34%7C7; permanent=0; _gitlab_session=226ad8a0be43681acf38c2fab9497240; __profilin=p%3Dt; request_method=GET
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266
Content-Length: 554

-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="text"

text default
-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain

Content of a.txt.

-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html

<!DOCTYPE html><title>Content of a.html.</title>

-----------------------------9051914041544843365972754266--

Aternativelly, cURL doit envoyer la même requête POST que votre formulaire de navigateur:

nc -l localhost 8000
curl -F "text=default" -F "file1=@a.html" -F "file1=@a.txt" localhost:8000

Vous pouvez faire plusieurs tests avec:

while true; do printf '' | nc -l localhost 8000; done

41
Obnoxious et d'autres choses non immédiatement évidente: boundary=---------------------------9051914041544843365972754266est deux traits d' union plus court alors les limites réelles dans les données. C'est vraiment, vraiment difficile à voir avec tous les traits d'union attachés ensemble.
Fake Name

1
curl --trace-ascii <logfilename> ..... est également pratique pour visualiser les données envoyées et reçues.
Craig Hicks

curl -trace <logfilename> ....affichera également binaire. Pratique pour observer <LF> vs <CR> <LF>.
Craig Hicks

@FakeName - Cette limite a été automatiquement créée par curl.
Craig Hicks

6
la limite est toujours - plus courte. Chaque séparateur de section MIME (limite) contient deux tirets supplémentaires à l'avant et le séparateur de limite de fin contient quatre tirets supplémentaires: deux à l'avant et deux à la fin.
Sergey Kuznetsov

24

Merci beaucoup à @Ciro Santilli answer! J'ai trouvé que son choix pour la limite est assez "malheureux" parce que tous ces traits d'union: en fait, comme @Fake Name l'a commenté, lorsque vous utilisez votre demande de limite à l'intérieur, elle est accompagnée de deux autres tirets au recto:

Exemple:

POST / HTTP/1.1
HOST: host.example.com
Cookie: some_cookies...
Connection: Keep-Alive
Content-Type: multipart/form-data; boundary=12345

--12345
Content-Disposition: form-data; name="sometext"

some text that you wrote in your html form ...
--12345
Content-Disposition: form-data; name="name_of_post_request" filename="filename.xyz"

content of filename.xyz that you upload in your form with input[type=file]
--12345
Content-Disposition: form-data; name="image" filename="picture_of_sunset.jpg"

content of picture_of_sunset.jpg ...
--12345--

J'ai trouvé sur cette page w3.org qu'il est possible d'incorporer un en-tête multipart / mixed dans un multipart / form-data, en choisissant simplement une autre chaîne de limite à l'intérieur de multipart / mixed et en l'utilisant pour incapsuler des données. À la fin, vous devez «fermer» toutes les limites utilisées dans l'ordre FILO pour fermer la requête POST (comme:

POST / HTTP/1.1
...
Content-Type: multipart/form-data; boundary=12345

--12345
Content-Disposition: form-data; name="sometext"

some text sent via post...
--12345
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=abcde

--abcde
Content-Disposition: file; file="picture.jpg"

content of jpg...
--abcde
Content-Disposition: file; file="test.py"

content of test.py file ....
--abcde--
--12345--

Jetez un œil au lien ci-dessus.


1
Pourquoi ne séparez-vous pas toutes les propriétés Content-Dispositionavec ;?
kelin

1
'> e <ncapsulate'
Craig Hicks
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.