Ranh giới trong nhiều dữ liệu / biểu mẫu là gì?


403

Tôi muốn hỏi một câu hỏi về multipart/form-data. Trong tiêu đề HTTP, tôi thấy rằng Content-Type: multipart/form-data; boundary=???.

???miễn phí được xác định bởi người dùng? Hay nó được tạo ra từ HTML? Có thể cho tôi định nghĩa ??? = abcdefg?


2
Tôi thấy đây là câu trả lời. w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Câu hỏi

Câu trả lời:


424

???miễn phí được xác định bởi người dùng?

Đúng.

hoặc nó được cung cấp bởi HTML?

Số HTML để làm với điều đó. Đọc dưới đây.

Có thể cho tôi định nghĩa ???như là abcdefg?

Đúng.

Nếu bạn muốn gửi dữ liệu sau đến máy chủ web:

name = John
age = 12

sử dụng application/x-www-form-urlencodedsẽ như thế này:

name=John&age=12

Như bạn có thể thấy, máy chủ biết rằng các tham số được phân tách bằng dấu và &. Nếu &được yêu cầu cho một giá trị tham số thì nó phải được mã hóa.

Vậy làm thế nào để máy chủ biết nơi một giá trị tham số bắt đầu và kết thúc khi nhận được yêu cầu HTTP bằng cách sử dụng multipart/form-data ?

Sử dụng ranh giới , tương tự như &.

Ví dụ:

--XXX
Content-Disposition: form-data; name="name"

John
--XXX
Content-Disposition: form-data; name="age"

12
--XXX--

Trong trường hợp đó, giá trị biên là XXX. Bạn chỉ định nó trong Content-Typetiêu đề để máy chủ biết cách phân chia dữ liệu mà nó nhận được.

Vì vậy, bạn cần phải:

  • Sử dụng một giá trị sẽ không xuất hiện trong dữ liệu HTTP được gửi đến máy chủ.

  • Hãy nhất quán và sử dụng cùng một giá trị ở mọi nơi trong thông báo yêu cầu.


54
Yout phải thêm một dấu "-" vào cuối ranh giới.
Sebastian Piskorski

13
Bạn có thể đọc nó trong tài liệu. Kết thúc ranh giới phải có thêm hai hypens "-" Liên kết: w3.org/TR/html401/interact/forms.html#h-17.13.4.2
Sebastian Piskorski

6
Câu trả lời chính xác. Một ranh giới chỉ là "chìa khóa" để phân tách nhiều "phần" của tải trọng nhiều phần. Thông thường một cái gì đó như '&' là đủ để phân tách các biến nhưng bạn cần một cái gì đó độc đáo hơn để tách các tải trọng trong tải trọng.
dùng2483724

1
@ K3rnel31 Tất nhiên, trừ khi chuỗi ranh giới mới có cùng độ dài.
Oscar Mederos

5
Tôi nghĩ rằng giá trị biên như được khai báo trong tiêu đề Kiểu nội dung sẽ thực sự là -XXX --- vì phải viết thêm "-" khi tách các phần (do đó --- XXX ---)
Theodore K .

96

Câu trả lời chính xác cho câu hỏi là: có, bạn có thể sử dụng một giá trị tùy ý cho boundarytham số , với điều kiện nó không vượt quá 70 byte và chỉ bao gồm 7 bitUS-ASCII (có thể in).

Nếu bạn đang sử dụng một trong các multipart/*loại nội dung, bạn thực sự được yêu cầu chỉ định boundarytham số trongContent-Type tiêu đề, nếu không, máy chủ (trong trường hợp yêu cầu HTTP) sẽ không thể phân tích tải trọng.

Bạn cũng có thể muốn đặt charsettham số UTF-8trong Content-Typetiêu đề của mình , trừ khi bạn có thể hoàn toàn chắc chắn rằng chỉUS-ASCII ký tự sẽ được sử dụng trong dữ liệu tải trọng.

Một vài trích đoạn có liên quan từ RFC2046 :

  • 4.1.2. Thông số bộ ký tự:

    Không giống như một số giá trị tham số khác, các giá trị của tham số bộ ký tự KHÔNG phân biệt chữ hoa chữ thường. Bộ ký tự mặc định, phải được giả sử trong trường hợp không có tham số bộ ký tự, là US-ASCII.

  • 5.1. Loại đa phương tiện

    Như đã nêu trong định nghĩa của trường Mã hóa chuyển nội dung [RFC 2045], không được phép mã hóa nào ngoài "7 bit", "8 bit" hoặc "nhị phân" đối với các thực thể thuộc loại "nhiều phần". Các trường phân cách ranh giới "nhiều phần" và các trường tiêu đề luôn được biểu thị là 7bit US-ASCII trong mọi trường hợp (mặc dù các trường tiêu đề có thể mã hóa văn bản tiêu đề không phải US-ASCII theo RFC 2047) và dữ liệu trong các bộ phận cơ thể có thể được mã hóa trên một cơ sở từng phần, với các trường Mã hóa chuyển nội dung cho từng phần cơ thể thích hợp.

    Trường Kiểu nội dung cho các thực thể nhiều phần yêu cầu một tham số, "ranh giới". Sau đó, dòng phân cách ranh giới được định nghĩa là một dòng bao gồm hai ký tự gạch nối ("-", giá trị thập phân 45) theo sau là giá trị tham số ranh giới từ trường tiêu đề Kiểu nội dung, khoảng trắng tuyến tính tùy chọn và CRLF kết thúc.

    Các dấu phân cách ranh giới không được xuất hiện trong tài liệu được đóng gói và không được dài hơn 70 ký tự, không tính hai dấu gạch nối hàng đầu.

    Đường phân cách ranh giới theo sau phần cơ thể cuối cùng là một dấu phân cách phân biệt cho biết rằng sẽ không có phần cơ thể nào tiếp theo. Một dòng phân cách như vậy giống hệt với các dòng phân cách trước đó, với việc thêm hai dấu gạch nối sau giá trị tham số biên.

Dưới đây là một ví dụ sử dụng ranh giới tùy ý:

Content-Type: multipart/form-data; charset=utf-8; boundary="another cool boundary"

--another cool boundary
Content-Disposition: form-data; name="foo"

bar
--another cool boundary
Content-Disposition: form-data; name="baz"

quux
--another cool boundary--

2
Tôi thích câu trả lời này nhất vì nó trích dẫn từ RFC về cách các dấu gạch nối được chỉ định.
Rick

@Rick Có một lý do hợp lệ để IETF làm điều đó - mặc dù tất cả chúng trông khá giống nhau, chỉ một trong bốn điều sau đây là ký tự gạch nối chính xác: - - -
antichris

ha, khi tôi nói hypens, ý tôi là câu trả lời của bạn đã cho tôi biết hypens nào được định nghĩa trong tiêu chuẩn. Tôi đã bối rối về việc hypens nào là "client được xác định" và đó là "đặc tả được xác định"
Rick

31

bội số / biểu mẫu dữ liệu chứa ranh giới cho các cặp tên / giá trị riêng biệt. Ranh giới hoạt động giống như một điểm đánh dấu của từng đoạn của các cặp tên / giá trị được thông qua khi một biểu mẫu được gửi. Ranh giới được tự động thêm vào loại nội dung của tiêu đề yêu cầu.

Biểu mẫu với thuộc tính enctype = "Multipart / form-data" sẽ có tiêu đề yêu cầu Content-Type: Multipart / form-data; ranh giới --- WebKit193844043-h ( trình duyệt tạo vaue ).

Tải trọng được chuyển qua trông giống như thế này:

Content-Type: multipart/form-data; boundary=---WebKitFormBoundary7MA4YWxkTrZu0gW

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”file”; filename=”captcha
    Content-Type:

    -----WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name=”action

    submit
    -----WebKitFormBoundary7MA4YWxkTrZu0gW--

Về phía dịch vụ web, nó được sử dụng ở dạng @Consume ("nhiều dữ liệu / biểu mẫu dữ liệu").

Chú ý, khi kiểm tra dịch vụ web của bạn bằng chrome postman, bạn cần kiểm tra tùy chọn dữ liệu biểu mẫu (nút radio) và menu Tệp từ hộp thả xuống để gửi tệp đính kèm. Cung cấp rõ ràng loại nội dung dưới dạng nhiều dữ liệu / biểu mẫu dữ liệu gây ra lỗi. Bởi vì ranh giới bị thiếu vì nó ghi đè yêu cầu cuộn tròn của người đăng bài lên máy chủ với loại nội dung bằng cách nối thêm ranh giới hoạt động tốt.

Xem RFC1341 giây7.2 Loại nội dung nhiều phần

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.