Esempio di multipart / form-data


103

Mi chiedo se qualcuno possa condividere con me un esempio di multipart / form-data che contiene:

  1. Alcuni parametri del modulo
  2. Più file

2
Vai qui: w3.org/TR/html401/interact/forms.html#h-17.13.4 In 17.13.4 Form content typestroverai ciò che cerchi.
Andrew Barber



Il caricamento in più parti carica file di grandi dimensioni per pezzi. Il caricamento di più file carica molti file di piccole dimensioni. Di cosa stai chiedendo?
Gangnus

Risposte:


126

EDIT : sto mantenendo una risposta simile, ma più approfondita su: https://stackoverflow.com/a/28380690/895245

Per vedere esattamente cosa sta succedendo, usa nc -lo un server ECHO e un agente utente come un browser o cURL.

Salva il modulo in un .htmlfile:

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

Crea file da caricare:

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

Correre:

nc -l localhost 8000

Apri l'HTML sul tuo browser, seleziona i file e fai clic su invia e controlla il terminale.

ncstampa la richiesta ricevuta. Firefox ha inviato:

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

In alternativa, cURL dovrebbe inviare la stessa richiesta POST del modulo del browser:

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

Puoi eseguire più test con:

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

41
Cose odiose e non immediatamente evidenti: boundary=---------------------------9051914041544843365972754266sono due trattini più brevi dei limiti effettivi nei dati. Questo è davvero, davvero difficile da vedere con tutti i trattini messi insieme.
Fake Name

1
curl --trace-ascii <logfilename> ..... è utile anche per visualizzare i dati inviati e ricevuti.
Craig Hicks

curl -trace <logfilename> ....mostrerà anche binario. Comodo per osservare <LF> vs <CR> <LF>.
Craig Hicks

@FakeName - Quel confine è stato creato automaticamente da curl.
Craig Hicks

6
il confine è sempre più corto. Ogni separatore di sezione MIME (confine) contiene due trattini aggiuntivi nella parte anteriore e il separatore di confine finale contiene quattro trattini aggiuntivi: due nella parte anteriore e due alla fine.
Sergey Kuznetsov

24

Mille grazie alla risposta di @Ciro Santilli! Ho scoperto che la sua scelta per il confine è piuttosto "infelice" perché tutti quei trattini: infatti, come ha commentato @Fake Name, quando usi la tua richiesta di confine interno viene fornito con altri due trattini sul davanti:

Esempio:

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

Ho trovato su questa pagina w3.org che è possibile incapsulare multipart / mixed header in multipart / form-data, semplicemente scegliendo un'altra stringa di confine all'interno di multipart / mixed e usando quella per incapsulare i dati. Alla fine, devi "chiudere" tutti i confini usati in FILO per chiudere la richiesta POST (come:

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

Dai un'occhiata al link qui sopra.


1
Perché non separa tutte le proprietà Content-Dispositioncon ;?
kelin

1
'> e <ncapsulate'
Craig Hicks
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.