Як окремо проаналізувати дані про багаточастинні поля / файли?


9

Я хочу двічі проаналізувати багаточасткову форму: один раз, щоб схопити вхідні поля, а пізніше обробити завантаження файлу.

Я намагаюся підтримувати належне розділення проблем у моїй програмі Node:

  • Контролер відповідає за обробку вхідних полів.
  • Модель відповідає за логіку файлу завантаження.

Мені потрібно передати дані полів у модель, щоб створити новий екземпляр, тому дані про поля повинні бути доступними до початку завантаження файлу.

В даний час кожен form.parse()або еквівалент функція аналізує обидва поля і файли разом . Приклад: req.pipe(busboy)обробляє і файл, і поля разом.

Я перевірив модулі, такі як node-multiparty, formidable, busboy, multer. Здається, ніхто не має для цього рішення.

Приклад того, що я хотів би досягти, ось тут: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

Це навіть можливо?


2
зачекайте ... значить, Ви будете мати, щоб Модель відповідала за логіку та контроль?
Меттью Марку Міллеру

Хороший улов, як правило, архітектура погано поєднує проблеми. Це було 2 роки тому, тому я точно не пам’ятаю, яку проблему я вирішував, коли я задавав це питання, але пам’ятаю, що хотів, щоб логіка збереження була частиною об’єкта схеми Mongoose. Маючи метод мангуста на моделі, я міг легко економити з будь-якого місця свого додатка. Озираючись назад, я не думаю, що метод збереження є загальним для того, щоб бути модельним методом, ймовірно, він повинен зберігати його як окремий метод обслуговування. mongoosejs.com/docs/guide.html
Скотт

1
хаха, я не розумів, скільки років цьому ... це якось перетекло до черги моєї черги "потребую відповіді". і так, я вважаю, що правильно зберігати операції зі збереженням окремо від даних, що зберігаються ОСОБЛИВО, коли ці об'єкти можуть передавати дані у двох вимірах. Полегшує викручування та зберігання речей поза контролером.
Меттью Марк Міллер

@Scott "Це було 2 роки тому, тому я точно не пам'ятаю, яку проблему я вирішував, коли я задавав це питання" - тоді ви можете розглянути питання про видалення цього питання, оскільки навряд чи на нього відповідуть взагалі ...
Тімоті Тріклер

Відповіді:


1

Я хочу відповісти на це запитання:

Чи можливо читати заголовки полів багаторівневих матеріалів перед їх змістом?

Коли я дивлюся на багаточастотний rfc , я бачу такий приклад:

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

Зауважу, що заголовки як би Content-Typeрозташовані між частинами тіла. Таким чином я роблю висновок, ви не можете всі заголовки перед усіма органами.

Тепер до вашого питання:

Я хочу двічі проаналізувати багаточасткову форму: один раз, щоб схопити вхідні поля, а пізніше обробити завантаження файлу.

Це залежить від того, що ви маєте на увазі під "розбором". Під час читання HTTP-повідомлення відбувається деякий аналіз, щоб знати, коли він закінчується. Кінець має додатковий --на кінці:

--boundary42--

Ідеї ​​для розбору двічі:

  • На завершення я повинен мати змогу скопіювати всю відповідь з сокета і зробити розбір пізніше.
  • Ви можете читати заголовки файлу перед тілом файлу, але не всі заголовки всіх файлів.

Це навіть можливо?

Так, є випадки, коли це можливо (коли файл - це останнє, що ви завантажуєте). Я не знаю, чи взагалі можливо те, що вам потрібно, оскільки я не знаю, що саме ви хочете робити.

Я сподіваюся, що це прояснює речі. Якщо це не повна відповідь або вам це не подобається, скажіть нам, чому це може бути цінним відгуком для інших, хто намагається відповісти на питання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.