จะแยกวิเคราะห์ข้อมูลหลายฟิลด์ / ไฟล์แยกจากกันได้อย่างไร?


9

ฉันต้องการแยกแบบฟอร์มหลายส่วนสองครั้ง: ครั้งหนึ่งเพื่อคว้าฟิลด์ที่เข้ามาและภายหลังเพื่อดำเนินการอัปโหลดไฟล์

ฉันกำลังพยายามแยกข้อกังวลที่เหมาะสมภายในแอพ Node ของฉัน:

  • คอนโทรลเลอร์มีหน้าที่ในการจัดการฟิลด์ที่เข้ามา
  • รุ่นรับผิดชอบตรรกะของไฟล์อัปโหลด

ฉันจำเป็นต้องส่งข้อมูลเขตข้อมูลลงในแบบจำลองเพื่อสร้างอินสแตนซ์ใหม่ดังนั้นข้อมูลเขตข้อมูลจึงต้องพร้อมใช้งานก่อนที่การอัปโหลดไฟล์จะเริ่มขึ้น

ขณะนี้ทุกคนform.parse()หรือฟังก์ชั่นเทียบเท่าแยกทั้งสองเขตข้อมูลและไฟล์ร่วมกัน ตัวอย่าง: req.pipe(busboy)จัดการทั้งไฟล์และฟิลด์ด้วยกัน

ฉันได้ตรวจสอบโมดูลเช่น node-multiparty, formidable, busboy, multer ดูเหมือนว่าไม่มีใครมีทางออกสำหรับเรื่องนี้

ตัวอย่างของสิ่งที่ฉันต้องการบรรลุอยู่ที่นี่: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

เป็นไปได้ไหม


2
เดี๋ยวก่อน ... ดังนั้นคุณจะมีรุ่นรับผิดชอบต่อตรรกะและการควบคุมหรือไม่
Matthew Mark Miller

จับได้ดีโดยปกติแล้วสถาปัตยกรรมจะไม่ดีในการรวมความกังวล นี่เป็น 2 ปีที่แล้วดังนั้นฉันจำไม่ได้ว่าปัญหาที่ฉันแก้เมื่อฉันถามคำถามนี้ แต่ฉันจำได้ว่าฉันต้องการตรรกะการบันทึกที่จะเป็นส่วนหนึ่งของวัตถุ scho Mongoose ด้วยวิธีการพังพอนในรูปแบบที่ฉันสามารถบันทึกได้อย่างง่ายดายจากที่ใดก็ได้ในแอปของฉัน มองย้อนกลับไปฉันไม่คิดว่าวิธีการบันทึกนั้นเป็นวิธีทั่วไปที่มากพอที่จะเป็นวิธีแบบจำลองได้ แต่อาจจะควรเก็บไว้เป็นวิธีการบริการที่แยกต่างหาก mongoosejs.com/docs/guide.html
Scott

1
ฮ่า ๆ ฉันไม่ได้รู้ว่ามันอายุเท่าไร ... มันไหลไปยังจุดสูงสุดของคิว "ต้องการตอบรับ" ของฉัน และใช่ฉันคิดว่ามันถูกต้องเพื่อให้การดำเนินงานคงอยู่แยกจากข้อมูลที่ยืนยันโดยเฉพาะเมื่อวัตถุเหล่านั้นอาจจะถ่ายโอนข้อมูลในสองมิติ ทำให้ง่ายต่อการไขสกรูและยังคงมีอยู่นอกตัวควบคุม
Matthew Mark Miller

@Scott "เมื่อ 2 ปีที่แล้วดังนั้นฉันจำไม่ได้ว่าปัญหาที่ฉันแก้เมื่อฉันถามคำถามนี้" - คุณอาจพิจารณาลบคำถามนี้เพราะมันไม่น่าจะตอบได้เลย ...
Timothy Truckle

คำตอบ:


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

แนวคิดสำหรับการแยกวิเคราะห์สองครั้ง:

  • ฉันสรุปได้ว่าเราควรคัดลอกคำตอบทั้งหมดจากซ็อกเก็ตและทำการแยกวิเคราะห์ในภายหลัง
  • คุณสามารถอ่านส่วนหัวของไฟล์ก่อนเนื้อความของไฟล์ แต่ไม่ใช่ส่วนหัวของไฟล์ทั้งหมด

เป็นไปได้ไหม

ใช่มีหลายกรณีที่เป็นไปได้ (เมื่อไฟล์เป็นสิ่งสุดท้ายที่คุณอัปโหลด) ฉันไม่ทราบว่าเป็นไปได้ในระดับสากลว่าคุณต้องการอะไรเพราะฉันไม่รู้ว่าคุณต้องการทำอะไร

ฉันหวังว่านี่จะอธิบายสิ่งต่าง ๆ หากนี่ไม่ใช่คำตอบที่สมบูรณ์หรือคุณไม่ชอบสิ่งนี้โปรดบอกเราว่าเพราะอะไรเพราะนี่อาจเป็นข้อเสนอแนะที่มีค่าสำหรับผู้อื่นที่พยายามตอบคำถาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.