2010-08-18 10 views
235

Voglio fare una domanda sul multipart/form-data. Nell'intestazione HTTP, trovo che il Content-Type: multipart/form-data; boundary=???.Qual è il limite in multipart/form-data?

Il numero ??? è definito dall'utente? O è generalmente da HTML? Posso definire lo ??? = abcdefg?

+2

Ho trovato questa è la risposta. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 – Questions

risposta

272

È il ??? definizione libera dall'utente?

Sì.

oppure è generale dall'HTML?

n HTML ha nulla a che fare con questo. Leggere sotto.

E 'possibile definire il ??? = abcdefg?

Sì.

Se si desidera inviare i seguenti dati al server Web:

name = John 
age = 12 

utilizzando application/x-www-form-urlencoded sarebbe come questo:

name=John&age=12 

Come si può vedere, il server sa che i parametri sono separati per & e se è richiesto & come valore di parametro, verrà codificato.

Ora, come fa il server a sapere dove inizia e termina un valore di parametro quando riceve una richiesta HTTP utilizzando multipart/form-data? Utilizzo del limite , simile a &.

Ad esempio:

--XXX 
Content-Disposition: form-data; name="name" 

John 
--XXX 
Content-Disposition: form-data; name="age" 

12 
--XXX-- 

In tal caso, il valore limite è XXX. Lo si specifica nell'intestazione Content-Type in modo che il server conosca come suddividere i dati inviati.

Quindi, è fondamentalmente necessario:

  • utilizzare un valore che non apparirà nei dati HTTP inviati al server.
  • Essere coerenti e utilizzare lo stesso valore su tutta la richiesta.
+25

Devi aggiungere un "-" extra alla fine del confine. –

+0

@SebastianPiskorski Non capisco ... –

+7

Puoi leggerlo nella documentazione. Fine del confine devono avere due ulteriori ipen "-" Link: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 –

60

la risposta esatta alla domanda è: sì, è possibile utilizzare un valore arbitrario per il parametro di boundary, dato che non supera i 70 byte di lunghezza e consiste soltanto in 7-bit US-ASCII caratteri (stampabili).

Se si utilizza uno di multipart/* tipi di contenuto, si sono in realtà necessaria per specificare il parametro boundary nell'intestazione Content-Type, altrimenti il ​​server (nel caso di una richiesta HTTP) non sarà in grado di analizzare il payload .

Probabilmente anche voler impostare il parametro charset-UTF-8 nel vostro Content-Type intestazione, a meno che non si può essere assolutamente sicuri che solo US-ASCII charset verrà utilizzato nei dati di payload.

alcuni stralci rilevanti dal RFC2046:

  • 4.1.2. Charset Parametro:

    A differenza di altri valori di parametro, i valori del parametro charset NON sono sensibili al maiuscolo/minuscolo. Il set di caratteri predefinito, che deve essere assunto in assenza di un parametro charset, è US-ASCII.

  • 5.1. Multipart Tipo di supporto

    Come indicato nella definizione del campo Content-Transfer-Encoding [RFC 2045], non codifica diversa da "7bit", "8bit", o "binario" è consentito per i soggetti di tipo " multipart". I delimitatori e i campi di intestazione "multipart" sono sempre rappresentati come 7bit US-ASCII in ogni caso (sebbene i campi di intestazione possano codificare testo di intestazione non US-ASCII come da RFC 2047) e i dati all'interno delle parti del corpo possano essere codificati su un base part-by-part, con i campi Content-Transfer-Encoding per ogni parte del corpo appropriata.

    Il campo Content-Type per entità multipart richiede un parametro, "boundary". La linea delimitatore del limite viene quindi definita come una riga composta interamente da due trattini ("-", valore decimale 45) seguito dal valore del parametro del limite dal campo dell'intestazione Content-Type, dagli spazi bianchi facoltativi e da un CRLF finale.

    I delimitatori di delimitazione non devono apparire all'interno del materiale incapsulato e non devono essere più lunghi di 70 caratteri, senza contare i due trattini iniziali.

    La linea di delimitazione del contorno che segue l'ultima parte del corpo è un delimitatore distinto che indica che non seguiranno ulteriori parti del corpo. Tale linea di delimitazione è identica alle precedenti linee di delimitazione, con l'aggiunta di altri due trattini dopo il valore del parametro limite.

Ecco un esempio utilizzando un limite arbitrario:

Content-Type: multipart/form-data; charset=utf-8; boundary="another cool boundary" 

--another cool boundary 
Content-Disposition: form-data; name="foo" 

bar 
--another cool boundary 
Content-Disposition: form-data; name="baz" 

quux 
--another cool boundary-- 
10

multipart/form-data contiene confine separare coppie nome/valore. Il limite agisce come un marcatore di ogni blocco di coppie nome/valore passato quando viene inviato un modulo. Il limite viene automaticamente aggiunto a un tipo di contenuto dell'intestazione di una richiesta.

Il modulo con l'attributo enctype = "multipart/form-data" avrà un'intestazione di richiesta Content-Type: multipart/form-data; confine --- WebKit193844043-h (valore generato dal browser).

Il payload passato simile a questa:

Content-Type: multipart/form-data; boundary=—-WebKitFormBoundary7MA4YWxkTrZu0gW 

    --—-WebKitFormBoundary7MA4YWxkTrZu0gW 
    Content-Disposition: form-data; name=”file”; filename=”captcha” 
    Content-Type: 

    --—-WebKitFormBoundary7MA4YWxkTrZu0gW 
    Content-Disposition: form-data; name=”action” 

    submit 
    --—-WebKitFormBoundary7MA4YWxkTrZu0gW-- 

Sul lato webservice, è consumato in @Consumes forma ("multipart/form-data").

Attenzione, quando si esegue il test del proprio servizio Web utilizzando postino cromato, è necessario controllare l'opzione dati modulo (pulsante di opzione) e il menu File dalla casella a discesa per inviare allegato. La fornitura esplicita di tipo di contenuto come multipart/form-data genera un errore. Poiché il contorno è mancante in quanto sovrascrive la richiesta di arricciatura di post-man al server con tipo di contenuto, aggiungendo il limite che funziona correttamente.

Vedere RFC1341 sec7.2 The Multipart Content-Type

Problemi correlati