Bagaimana cara menguraikan data bidang / file multi bagian secara terpisah?


9

Saya ingin menguraikan formulir multi bagian dua kali: satu kali untuk mengambil bidang yang masuk, dan kemudian untuk memproses unggahan file.

Saya mencoba mempertahankan pemisahan kekhawatiran yang tepat dalam aplikasi Node saya:

  • Pengendali bertanggung jawab untuk menangani bidang yang masuk.
  • Model bertanggung jawab atas logika file unggahan.

Saya perlu meneruskan data bidang ke dalam model untuk membuat contoh baru, sehingga data bidang harus tersedia sebelum pengunggahan file dimulai.

Saat ini setiap form.parse()atau fungsi yang setara menguraikan bidang dan file secara bersamaan . Contoh: req.pipe(busboy)menangani file dan bidang secara bersamaan.

Saya telah memeriksa modul-modul seperti simpul-multipartai, tangguh, busboy, multer. Sepertinya tidak ada yang punya solusi untuk ini.

Contoh apa yang ingin saya capai ada di sini: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

Apakah ini mungkin?


2
tunggu ... jadi Anda akan membuat Model bertanggung jawab atas logika dan kontrol?
Matthew Mark Miller

Tangkapan yang bagus, biasanya arsitektur itu buruk untuk memadukan kekhawatiran. Ini adalah 2 tahun yang lalu jadi saya tidak ingat persis masalah apa yang saya pecahkan ketika saya mengajukan pertanyaan ini, tetapi saya ingat bahwa saya ingin menyimpan logika untuk menjadi bagian dari objek skema Mongoose. Dengan memiliki metode luwak pada model, saya dapat dengan mudah menyimpan dari mana saja di aplikasi saya. Melihat ke belakang, saya tidak berpikir bahwa metode save cukup umum untuk menjadi metode model, mungkin harus menyimpannya sebagai metode layanan terpisah. mongoosejs.com/docs/guide.html
Scott

1
lol Saya tidak menyadari berapa umur ini ... entah bagaimana mengalir ke puncak antrian "kebutuhan menjawab" saya. dan ya, saya pikir itu benar untuk menjaga operasi kegigihan terpisah dari data yang bertahan TERUTAMA ketika objek-objek itu mungkin mentransfer data dalam dua dimensi. Membuatnya mudah untuk mengacaukan dan mempertahankan hal-hal di luar pengontrol.
Matthew Mark Miller

@Scott "Ini 2 tahun yang lalu jadi saya tidak ingat persis masalah apa yang saya pecahkan ketika saya mengajukan pertanyaan ini" - maka Anda dapat mempertimbangkan untuk menghapus pertanyaan ini karena tidak mungkin dijawab sama sekali ...
Timothy Truckle

Jawaban:


1

Saya ingin menjawab pertanyaan ini:

Apakah mungkin, untuk membaca tajuk bidang multi bagian sebelum isinya?

Ketika saya melihat multipart rfc , saya melihat contoh ini:

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

Saya perhatikan bahwa header suka Content-Typeterletak di antara bagian-bagian tubuh. Demikian saya simpulkan, Anda tidak bisa semua header sebelum semua badan.

Sekarang untuk pertanyaan Anda:

Saya ingin menguraikan formulir multi bagian dua kali: satu kali untuk mengambil bidang yang masuk, dan kemudian untuk memproses unggahan file.

Itu tergantung apa yang Anda maksud dengan "parsing". Ada beberapa penguraian yang terlibat saat membaca pesan HTTP untuk mengetahui kapan itu berakhir. Akhir memiliki tambahan --di akhir:

--boundary42--

Gagasan untuk parsing dua kali:

  • Saya menyimpulkan, seseorang harus dapat menyalin seluruh jawaban dari soket dan melakukan parsing nanti.
  • Anda dapat membaca tajuk file di depan badan file tetapi tidak semua tajuk dari semua file.

Apakah ini mungkin?

Ya, ada beberapa kasus yang memungkinkan (saat file adalah hal terakhir yang Anda unggah). Saya tidak tahu apakah mungkin secara universal apa yang Anda butuhkan karena saya tidak tahu persis apa yang ingin Anda lakukan.

Saya harap ini menjelaskan beberapa hal. Jika ini bukan jawaban yang lengkap atau Anda tidak suka ini, tolong beri tahu kami mengapa karena ini mungkin umpan balik berharga bagi orang lain yang mencoba menjawab pertanyaan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.