Làm cách nào để phân tách dữ liệu trường / tệp nhiều phần riêng biệt?


9

Tôi muốn phân tích một hình thức nhiều phần hai lần: một lần để lấy các trường đến và sau đó để xử lý tệp tải lên.

Tôi đang cố gắng duy trì một sự tách biệt thích hợp trong các ứng dụng Node của mình:

  • Bộ điều khiển chịu trách nhiệm xử lý các trường đến.
  • Mô hình chịu trách nhiệm về logic tập tin tải lên.

Tôi cần chuyển dữ liệu trường vào mô hình để tạo một thể hiện mới, vì vậy dữ liệu trường cần phải có sẵn trước khi quá trình tải lên tệp bắt đầu.

Hiện tại mọi form.parse()chức năng hoặc tương đương phân tích cả hai trường và tệp cùng nhau . Ví dụ: req.pipe(busboy)xử lý cả tệp và trường cùng nhau.

Tôi đã kiểm tra các mô-đun như nút đa nhân, ghê gớm, busboy, multer. Không ai có vẻ có một giải pháp cho việc này.

Một ví dụ về những gì tôi muốn đạt được là ở đây: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

Điều này thậm chí có thể?


2
chờ đã ... vậy bạn sẽ có Mô hình chịu trách nhiệm về logic và điều khiển chứ?
Matthew Mark Miller

Bắt tốt, thông thường kiến ​​trúc đó là xấu để trộn lẫn các mối quan tâm. Đây là 2 năm trước vì vậy tôi không nhớ chính xác vấn đề mình đang giải quyết khi hỏi câu hỏi này, nhưng tôi nhớ rằng tôi muốn logic lưu là một phần của đối tượng lược đồ Mongoose. Bằng cách có phương pháp cầy mangut trên mô hình, tôi có thể dễ dàng lưu từ mọi nơi trong ứng dụng của mình. Nhìn lại, tôi không nghĩ rằng phương thức lưu đủ chung chung để trở thành một phương thức mô hình, có lẽ nên giữ nó như một phương thức dịch vụ riêng biệt. mongoosejs.com/docs/guide.html
Scott

1
lol tôi đã không nhận ra cái này bao nhiêu tuổi ... bằng cách nào đó nó đã chảy lên đầu hàng đợi "cần trả lời" của tôi. và vâng, tôi nghĩ thật đúng đắn khi tách biệt các hoạt động bền bỉ khỏi dữ liệu đang tồn tại ĐẶC BIỆT khi các đối tượng đó có thể truyền dữ liệu theo hai chiều. Làm cho nó dễ dàng để vặn và duy trì những thứ bên ngoài bộ điều khiển.
Matthew Mark Miller

@ Hủy bỏ "Đây là 2 năm trước vì vậy tôi không nhớ chính xác vấn đề mình đã giải quyết khi tôi hỏi câu hỏi này" - sau đó bạn có thể cân nhắc xóa câu hỏi này vì không chắc là nó sẽ được trả lời ...
Timothy Truckle

Câu trả lời:


1

Tôi muốn trả lời câu hỏi này:

Có thể, để đọc các tiêu đề trường nhiều phần trước nội dung của chúng?

Khi tôi nhìn vào rfc nhiều phần , tôi thấy ví dụ này:

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

Tôi lưu ý rằng các tiêu đề như Content-Typenằm giữa các bộ phận cơ thể. Vì vậy, tôi kết luận, bạn không thể tất cả các tiêu đề trước tất cả các cơ quan.

Bây giờ đến câu hỏi của bạn:

Tôi muốn phân tích một hình thức nhiều phần hai lần: một lần để lấy các trường đến và sau đó để xử lý tệp tải lên.

Nó phụ thuộc vào những gì bạn có nghĩa là "phân tích cú pháp". Có một số phân tích liên quan khi đọc thông điệp HTTP để biết khi nào nó kết thúc. Kết thúc có một bổ sung --ở cuối:

--boundary42--

Ý tưởng để phân tích cú pháp hai lần:

  • Tôi kết luận, người ta sẽ có thể sao chép toàn bộ câu trả lời từ ổ cắm và thực hiện phân tích cú pháp sau.
  • Bạn có thể đọc các tiêu đề của tệp trước phần thân của tệp nhưng không phải tất cả các tiêu đề của tất cả các tệp.

Điều này thậm chí có thể?

Có, có những trường hợp có thể xảy ra (khi tệp là thứ cuối cùng bạn tải lên). Tôi không biết liệu có thể phổ biến những gì bạn cần không vì tôi không biết chính xác những gì bạn muốn làm.

Tôi hy vọng điều này làm rõ mọi thứ. Nếu đây không phải là một câu trả lời hoàn chỉnh hoặc bạn không thích điều này, xin vui lòng cho chúng tôi biết lý do vì đây có thể là phản hồi có giá trị cho những người khác đang cố gắng trả lời câu hỏi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.