2009-08-27 55 views

Trả lời

58

Nó phải làm gì với cách trình duyệt gói nhị phân và dữ liệu biểu mẫu để truyền qua HTTP. Theo mặc định, chỉ có dữ liệu biểu mẫu được gửi, nhưng nếu biểu mẫu cần hỗ trợ tải lên tệp thì dữ liệu nhị phân cũng phải được nối và tách ra khỏi dữ liệu biểu mẫu.

Scott Hanselman đưa ra một lời giải thích tốt here này:

HTTP và như thế nào File Upload công trình thông qua HTTP

Đó là luôn luôn tốt hơn, đối với tôi, để hiểu lý do và cách điều gì đó đang xảy ra. Nếu bạn nói "chỉ vì" hoặc "bất cứ điều gì, bạn chỉ cần thêm rằng, và nó hoạt động" sau đó tôi nghĩ rằng đó là buồn. Đối với một số lý do trong khi nhiều người hiểu FORM MẪU và nói chung như thế nào dữ liệu hình thức được truyền lên đến máy chủ, khi một tập tin được chuyển giao nhiều chỉ kết luận đó là ma thuật. Tại sao chúng ta phải thêm enctype = "multipart/form = data" vào các biểu mẫu của chúng tôi bao gồm các tệp tải lên? Bởi vì biểu mẫu sẽ được POST ở nhiều phần.

Nếu bạn có một hình thức như thế này:

<form action="/home/uploadfiles" method="post" enctype="multipart/form-data"> 
    <label for="file">Filename:</label> 
    <input type="file" name="file" id="file" /> 
    <input type="submit" name="submit" value="Submit" /> 
</form> 

Các kết quả Form POST sẽ giống như thế này (hơi đơn giản):

POST /home/uploadfiles HTTP/1.1 
Content-Type: multipart/form-data; boundary=---------------------------7d81b516112482 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64) 
Content-Length: 324 

-----------------------------7d81b516112482 
Content-Disposition: form-data; name="file"; filename="\\SERVER\Users\Scott\test.txt" 
Content-Type: text/plain 

foo 
-----------------------------7d81b516112482 
Content-Disposition: form-data; name="submit" 

Submit 
-----------------------------7d81b516112482-- 

Chú ý một vài những điều về POST này. Đầu tiên, hãy chú ý đến kiểu nội dung và ranh giới = "" và cách ranh giới được sử dụng sau này, chính xác như vậy, ranh giới giữa nhiều phần. Xem phần đầu tiên cho thấy rằng tôi đã tải lên một tệp, loại văn bản/đồng bằng. Bạn có thể nội suy từ điều này như thế nào bạn mong muốn nhiều tập tin để hiển thị nếu tất cả chúng được POST cùng một lúc.

Và tất nhiên, nhìn vào cách khác nhau này sẽ xem xét nếu nó chỉ là một hình thức POST cơ bản mà không có enctype = "multipart/form = dữ liệu" bao gồm:

POST /home/uploadfiles HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
UA-CPU: x86 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64) 
Content-Length: 13 

submit=Submit 

Xem cách loại nội dung khác nhau? Đây là dạng POST thông thường, điển hình. Có lẽ không điển hình ở chỗ nó chỉ bao gồm nút Gửi! Ngoài ra, nếu bạn nhìn vào một email của bạn với nhiều tập tin đính kèm, nó sẽ trông rất giống với phần thân của thông điệp HTTP đầu tiên khi mã hóa MIME nhiều phần được tìm thấy ở khắp mọi nơi, như là thông thường với hầu hết các ý tưởng hay.

+0

bạn có thể xin giải thích là những gì dữ liệu nhị phân khi tải lên tệp văn bản? Giả sử tôi tải lên tệp văn bản, tại sao nó có thể được gửi dưới dạng tham số yêu cầu trong nội dung bài nơi tên tham số có thể là tên tệp và giá trị có thể là nội dung tệp? Về cơ bản Nếu tôi có thể tự dán nội dung tập tin vào vùng văn bản trên HTML/JSP được chuyển đến máy chủ như thông số yêu cầu bài bình thường đọc ở phía máy chủ thì tại sao việc tải lên tệp yêu cầu nhiều phần? –

1

Đó là một phần của đặc tả cho Tải lên tệp HTML như được mô tả trong RFC-1867, đó là đề xuất cho phép tải lên tệp ở dạng HTML (khoảng năm 1995).

Từ phần 2:

Đề xuất này làm cho hai thay đổi sang HTML:

1) Thêm một lựa chọn FILE cho thuộc tính TYPE của INPUT.
2) Cho phép thuộc tính ACCEPT cho thẻ INPUT, đây là danh sách các loại phương tiện hoặc loại phương tiện được phép cho đầu vào.

Bên cạnh đó, nó định nghĩa một loại phương tiện MIME mới, multipart/form-data, và xác định hành vi của đại lý người dùng HTML khi giải thích một hình thức
với ENCTYPE="multipart/form-data" và/hoặc <INPUT type="file">
thẻ.

Khi bạn thiết lập enctype-multipart/form-data, trình duyệt tách mỗi tập tin hoặc tập tin đính kèm trong tải lên với một "ranh giới nhiều phần dữ liệu", mà là một định danh duy nhất xác định sự bắt đầu và kết thúc của mỗi "phần".

đó cho phép trình duyệt gửi nhiều bộ phận (do đó tên) trong một yêu cầu, và xác định mỗi một với siêu dữ liệu riêng của mình như loại mime, tên tập tin, vv

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