Come analizzare i dati del campo / file multipart separatamente?


9

Voglio analizzare un modulo multipart due volte: una volta per afferrare i campi in arrivo e successivamente per elaborare il caricamento del file.

Sto cercando di mantenere una corretta separazione delle preoccupazioni all'interno della mia app Node:

  • Il controller è responsabile della gestione dei campi in arrivo.
  • Il modello è responsabile della logica del file di caricamento.

Devo passare i dati dei campi nel modello per creare una nuova istanza, quindi i dati dei campi devono essere disponibili prima dell'inizio del caricamento del file.

Attualmente ogni form.parse()o una funzione equivalente analizza entrambi i campi e file insieme . Esempio: req.pipe(busboy)gestisce insieme file e campi.

Ho controllato moduli come multiparty, formidabile, busboy, multer. Nessuno sembra avere una soluzione per questo.

Un esempio di ciò che vorrei ottenere è qui: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

È anche possibile?


2
aspetta ... quindi il Modello sarà responsabile della logica e del controllo?
Matthew Mark Miller,

Buona cattura, normalmente quell'architettura è male per confondere le preoccupazioni. Questo è successo 2 anni fa, quindi non ricordo esattamente quale problema stavo risolvendo quando stavo ponendo questa domanda, ma ricordo che volevo che la logica di salvataggio facesse parte dell'oggetto schema Mongoose. Avendo il metodo mangusta sul modello, ho potuto facilmente salvare da qualsiasi parte della mia app. Guardando indietro, non credo che il metodo di salvataggio sia abbastanza generico da essere un metodo modello, probabilmente dovrebbe tenerlo come un metodo di servizio separato. mongoosejs.com/docs/guide.html
Scott

1
lol non mi ero reso conto di quanti anni avesse ... scorreva in qualche modo in cima alla mia coda "bisogna rispondere". e sì, penso che sia corretto mantenere le operazioni di persistenza separate dai dati persistentemente in modo ESPECENTE quando quegli oggetti possono trasferire dati in due dimensioni. Rende facile rovinare e persistere cose al di fuori del controller.
Matthew Mark Miller,

@Scott "Questo è stato 2 anni fa, quindi non ricordo esattamente quale problema stavo risolvendo quando stavo ponendo questa domanda" - quindi potresti considerare di eliminare questa domanda poiché è improbabile che abbia una risposta a tutti ...
Timothy Truckle,

Risposte:


1

Voglio rispondere a questa domanda:

È possibile leggere le intestazioni dei campi multipart prima del loro contenuto?

Quando guardo l' RFC multipart , vedo questo esempio:

From:  Nathaniel Borenstein <nsb@bellcore.com> 
To: Ned Freed <ned@innosoft.com> 
Subject: Formatted text mail 
MIME-Version: 1.0 
Content-Type: multipart/alternative; boundary=boundary42 


--boundary42 
Content-Type: text/plain; charset=us-ascii 

...plain text version of message goes here.... 

--boundary42 
Content-Type: text/richtext 

.... richtext version of same message goes here ... 
--boundary42 
Content-Type: text/x-whatever 

.... fanciest formatted version of same  message  goes  here 
... 
--boundary42-- 

Noto che le intestazioni simili Content-Typesi trovano tra le parti del corpo. Concludo così, non è possibile tutte le intestazioni prima di tutti i corpi.

Ora alla tua domanda:

Voglio analizzare un modulo multipart due volte: una volta per afferrare i campi in arrivo e successivamente per elaborare il caricamento del file.

Dipende da cosa intendi per "analisi". Durante la lettura del messaggio HTTP è necessario analizzare alcuni dati per sapere quando termina. La fine ha un ulteriore --alla fine:

--boundary42--

Idee per l'analisi due volte:

  • Concludo, si dovrebbe essere in grado di copiare l'intera risposta dal socket ed eseguire l'analisi in un secondo momento.
  • Puoi leggere le intestazioni del file prima del corpo del file ma non tutte le intestazioni di tutti i file.

È anche possibile?

Sì, ci sono casi in cui è possibile (quando il file è l'ultima cosa che carichi). Non so se sia universalmente possibile ciò di cui hai bisogno in quanto non so esattamente cosa vuoi fare.

Spero che questo chiarisca le cose. Se questa non è una risposta completa o non ti piace, ti preghiamo di dirci perché questo potrebbe essere un feedback prezioso per gli altri che cercano di rispondere alla domanda.

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.