2009-06-24 23 views
16

Ok điều này có vẻ giống như một câu hỏi noob nhưng một trong nhiều nhà phát triển web mà tôi biết không hiểu đầy đủ.Http và tải lên tập tin - Làm thế nào nó thực sự hoạt động (dưới mui xe)

Về cơ bản, cách tải lên tệp từ hộp nhập tệp trang web tới máy chủ web (lưu trữ trang web .net chẳng hạn) bằng sự kiện tải lên của Kiểm soát tải lên tệp?

Sự hiểu biết của tôi là một bài đăng được gửi tới máy chủ yêu cầu luồng, sau đó được truyền lại cho trình duyệt và luồng dữ liệu đến máy chủ bắt đầu.

Bạn tôi nói rằng sự hiểu biết của anh ấy là toàn bộ tệp được mã hóa vào yêu cầu bài của trình duyệt và bài đăng (lớn) sau đó được gửi đến máy chủ.

Tôi nghĩ đây không phải là trường hợp như vậy sẽ không có cách nào để xây dựng thanh tiến trình ajax vì máy chủ sẽ không thể làm gì cho đến khi nó nhận được toàn bộ bài đăng vào thời điểm cũng chỉ lưu tệp vào đĩa của nó.

Vậy nó thực sự hoạt động như thế nào từ trình duyệt đến máy chủ?

+2

Đây là câu hỏi hợp lệ. +1 – samoz

Trả lời

9

Bạn của bạn là đúng. Nếu bạn muốn một thanh tiến trình AJAX, bạn phải nhảy qua một số vòng lặp. Thông thường, kỹ thuật này là đăng tải lên bên trong iframe lên IHttpHandler trên máy chủ lưu trữ tiến trình trên máy chủ trong từ điển máy chủ được khóa bằng mã định danh mà ứng dụng khách tạo và bao gồm trong cả yêu cầu tiến trình AJAX và bài đăng tải lên. Bằng cách đó, khi khách hàng thực hiện các yêu cầu AJAX, mã máy chủ xử lý yêu cầu đó có thể đọc giá trị từ từ điển đó để xem có bao nhiêu byte của tệp POST yêu cầu mà máy chủ đã xử lý.

Có, nó phức tạp :)

+0

Tôi nghĩ rằng điều này có ý nghĩa, nhưng nó cho thấy rằng httphandler hoạt động trên một cấp độ mạng và có thể phát hiện các gói tin đến của một bài viết một phần? – Sheff

+1

HttpHandlers không hoạt động 'ở cấp độ mạng', nhưng chúng có thể hoạt động ở mức thấp hơn so với trang chuẩn. Trên một trang bình thường, cho đến khi POST đã được tải đầy đủ trên máy chủ, mã xử lý sự kiện của bạn không chạy. Trong IHttpHandler, bạn có thể xử lý dữ liệu khi nó đến, nhưng bạn mất tất cả các công cụ tự động mà vòng đời trang làm cho bạn. –

7

Tôi nghĩ rằng bạn của bạn là đúng, tệp được mã hóa vào bài đăng được gửi đến máy chủ. Nếu bạn thực sự muốn xem chính xác cách hoạt động, hãy thử sử dụng Tamper Data trong Firefox để xem dữ liệu bài đăng thực tế.

ETA:

AJAX phong cách cập nhật bạn đề cập đến công việc bằng cách làm bài trong một iframe ẩn, sau đó sử dụng các yêu cầu AJAX để kiểm tra tiến độ tải lên trên phía máy chủ.

+0

OK những gì người bạn đời của tôi đang nói rằng tôi khá chắc chắn là đúng nhưng chắc chắn các httphandler đã nhận được bài viết trước khi nó có thể làm bất cứ điều gì? Và bởi thời gian này nó có toàn bộ bài viết anyway. hoặc một httphandler làm việc trên cấp độ mạng và các gói dữ liệu đánh chặn bạn có thể giải thích thêm? – Sheff

+1

Một số máy chủ có thể bắt đầu xử lý yêu cầu sau khi tiêu đề được đọc nhưng trước khi dữ liệu được đọc. Một số khung công tác mà tôi đã sử dụng cung cấp cho phần thân của một yêu cầu dưới dạng một luồng (trừ khi các tiêu đề và các phân đoạn đó được phân tích cú pháp). Hầu hết các trình xử lý yêu cầu, tất nhiên, không gửi trả lời cho đến khi yêu cầu được đọc hoàn toàn. –

+1

Tôi không chắc chắn rằng toàn bộ bài đăng đã được tải xuống tại điểm mà ProcessRequest() được gọi trên httphandler của bạn, nhưng tôi không thể tìm thấy bất kỳ tài liệu thực nào để nói theo cách này hay cách khác. –

Các vấn đề liên quan