Jak oddzielnie analizować dane pola / pliku wieloczęściowego?


9

Chcę przeanalizować formularz wieloczęściowy dwa razy: raz, aby pobrać przychodzące pola, a później przetworzyć przesyłanie pliku.

Staram się zachować właściwy rozdział problemów w mojej aplikacji Node:

  • Kontroler odpowiada za obsługę pól przychodzących.
  • Model odpowiada za logikę pliku do przesłania.

Muszę przekazać dane pól do modelu, aby utworzyć nową instancję, więc dane pól muszą być dostępne przed rozpoczęciem przesyłania pliku.

Obecnie każda form.parse()lub równoważna funkcja analizuje oba pola i pliki razem . Przykład: req.pipe(busboy)obsługuje jednocześnie plik i pola.

Sprawdziłem moduły takie jak węzeł multiparty, budzący grozę, busboy, multer. Wydaje się, że nikt nie ma na to rozwiązania.

Przykład tego, co chciałbym osiągnąć, jest tutaj: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

Czy to w ogóle możliwe?


2
czekaj ... więc będziesz odpowiedzialny za model i logikę?
Matthew Mark Miller

Dobry haczyk, zwykle architektura nie jest w stanie mieszać obaw. To było 2 lata temu, więc nie pamiętam dokładnie, jaki problem rozwiązałem, zadając to pytanie, ale pamiętam, że chciałem, aby logika składowania była częścią obiektu schematu Mongoose. Mając metodę mangusty na modelu, mogłem łatwo zapisać z dowolnego miejsca w mojej aplikacji. Patrząc wstecz, nie sądzę, aby metoda składowania była wystarczająco ogólna, aby była metodą modelową, prawdopodobnie powinna zachować ją jako oddzielną metodę obsługi. mongoosejs.com/docs/guide.html
Scott

1
lol, nie zdawałem sobie sprawy, ile to było lat ... jakoś popłynęło na szczyt mojej kolejki „potrzebuje odpowiedzi”. i tak, myślę, że poprawne jest oddzielanie operacji utrwalania osobno od utrwalania danych SZCZEGÓLNIE, gdy obiekty te mogą przenosić dane w dwóch wymiarach. Ułatwia zepsucie i utrwalenie rzeczy poza kontrolerem.
Matthew Mark Miller

@Scott „To było 2 lata temu, więc nie pamiętam dokładnie, jaki problem rozwiązałem, gdy zadawałem to pytanie” - wtedy możesz rozważyć usunięcie tego pytania, ponieważ jest mało prawdopodobne, że odpowiedź będzie w ogóle ...
Timothy Truckle

Odpowiedzi:


1

Chcę odpowiedzieć na to pytanie:

Czy to możliwe, aby przeczytać wieloczęściowe nagłówki pól przed ich zawartością?

Kiedy patrzę na multipart rfc , widzę ten przykład:

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

Zwracam uwagę, że podobne nagłówki Content-Typeznajdują się między częściami ciała. Podsumowując, nie można wszystkich nagłówków przed wszystkimi ciałami.

Teraz na twoje pytanie:

Chcę przeanalizować formularz wieloczęściowy dwa razy: raz, aby pobrać przychodzące pola, a później przetworzyć przesyłanie pliku.

Zależy to, co rozumiesz przez „parsowanie”. Podczas odczytywania wiadomości HTTP występuje parsowanie, aby wiedzieć, kiedy się kończy. Koniec ma --na końcu dodatkowe:

--boundary42--

Pomysły na parsowanie dwukrotnie:

  • Kończę, należy skopiować całą odpowiedź z gniazda i parsować później.
  • Możesz odczytać nagłówki pliku przed treścią pliku, ale nie wszystkie nagłówki wszystkich plików.

Czy to w ogóle możliwe?

Tak, są przypadki, w których jest to możliwe (gdy plik jest ostatnią przesłaną rzeczą). Nie wiem, czy jest to ogólnie możliwe, czego potrzebujesz, ponieważ nie wiem dokładnie, co chcesz zrobić.

Mam nadzieję, że to wyjaśnia. Jeśli nie jest to pełna odpowiedź lub nie podoba ci się to, powiedz nam dlaczego, ponieważ może to być cenna informacja zwrotna dla innych próbujących odpowiedzieć na pytanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.