2014-05-15 8 views
5

Ho una forma semplice:multipart/form-data con array

<form method="post" action="/test"> 
    <input type="hidden" name="arr[]" value="val1"> 
    <input type="hidden" name="arr[]" value="val2"> 
    <input type="hidden" name="arr[]" value="val3"> 
    <input type="submit" value="Submit"> 
</form> 

Con il controllore:

//... 
server.post('/test', function(req, res) { 
    res.json(req.body); 
}); 
//... 

Ciò restituisce bene con:

{ 
    arr: [ 
    "val1", 
    "val2", 
    "val3" 
    ] 
} 

Tuttavia, quando cambia l'enctype in multipart/formdata

<form method="post" action="/test" enctype="multipart/form-data"> 
    <input type="hidden" name="arr[]" value="val1"> 
    <input type="hidden" name="arr[]" value="val2"> 
    <input type="hidden" name="arr[]" value="val3"> 
    <input type="submit" value="Submit"> 
</form> 

Il server ora risponde con:

{ 
    arr[]: "val3" 
} 

Qual è il problema? C'è qualche tipo di configurazione di cui ho bisogno?

Nel caso ve lo stiate chiedendo, sto anche inviando un file, ecco perché ho bisogno dello multipart/form-data.

+1

sembra più multiparty non gestisce questa situazione correttamente. Sarebbe interessato a vedere cosa viene fuori. Se non trovi alcuna soluzione, prova a segnalarla sotto: https://github.com/andrewrk/node-multiparty/issues –

+0

Hai scoperto cosa c'era che non andava? Ho lo stesso problema qui –

+0

La sintassi dell'array è un'estensione non standard per formare la sintassi. L'analisi del tuo corpo per i dati codificati nell'URL lo riconosce ma il parser del tuo corpo per i dati multipart non lo fa. Non hai fornito un [mcve] quindi non sappiamo quali parser corporei stai usando, quindi non possiamo dire se è perché non c'è supporto o se il supporto deve essere abilitato. – Quentin

risposta

0

è probabilmente legata all'uso di body-parser (in particolare il metodo urlencoded), che, by default, lavora su richieste con l'unico tipo di supporto application/x-www-form-urlencoded.

Il modulo principale ha probabilmente alcune linee come queste:

const bodyParser = require('body-parser'); 
app.use(bodyParser.urlencoded()); 

suppongo, si può solo aggiungere il seguente ad avere richieste di tipo multipart/form-data analizzato così:

app.use(bodyParser.urlencoded({ 
    type: 'multipart/form-data' 
})); 
+0

La sintassi multipart è completamente diversa dalla sintassi urlencoded. Non è possibile utilizzare un parser per uno con l'altro. – Quentin

+0

Whoops, mio ​​cattivo! Ma il parser corporeo non ha una sintassi multipart, avrete bisogno di un modulo dedicato per la gestione di richieste multipart, come busboy o multer, come menzionato nella documentazione di body-parser. –

+0

Ne stanno già utilizzando uno (altrimenti non otterrebbero i risultati che dicevano che stavano ottenendo), ma non sappiamo quale. – Quentin