Ví dụ về đa phần / dữ liệu biểu mẫu


103

Tôi tự hỏi liệu có ai có thể chia sẻ với tôi một ví dụ về nhiều phần / biểu mẫu-dữ liệu có chứa:

  1. Một số tham số hình thức
  2. Nhiều tệp

2
Truy cập vào đây: w3.org/TR/html401/interact/forms.html#h-17.13.4 Trong đó, 17.13.4 Form content typesbạn sẽ tìm thấy những gì bạn tìm kiếm.
Andrew Barber



Tải lên nhiều phần tải lên các tệp lớn theo từng phần. Tải lên nhiều tệp tải lên nhiều tệp nhỏ. Bạn đang hỏi về điều gì?
Gangnus

Câu trả lời:


126

CHỈNH SỬA : Tôi đang duy trì một câu trả lời tương tự nhưng chuyên sâu hơn tại: https://stackoverflow.com/a/28380690/895245

Để xem chính xác điều gì đang xảy ra, hãy sử dụng nc -lhoặc máy chủ ECHO và tác nhân người dùng như trình duyệt hoặc cURL.

Lưu biểu mẫu vào một .htmltệp:

<form action="http://localhost:8000" method="post" enctype="multipart/form-data">
  <p><input type="text" name="text" value="text default">
  <p><input type="file" name="file1">
  <p><input type="file" name="file2">
  <p><button type="submit">Submit</button>
</form>

Tạo tệp để tải lên:

echo 'Content of a.txt.' > a.txt
echo '<!DOCTYPE html><title>Content of a.html.</title>' > a.html

Chạy:

nc -l localhost 8000

Mở HTML trên trình duyệt của bạn, chọn tệp và nhấp vào gửi và kiểm tra thiết bị đầu cuối.

ncin yêu cầu nhận được. Firefox đã gửi:

POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: __atuvc=34%7C7; permanent=0; _gitlab_session=226ad8a0be43681acf38c2fab9497240; __profilin=p%3Dt; request_method=GET
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266
Content-Length: 554

-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="text"

text default
-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain

Content of a.txt.

-----------------------------9051914041544843365972754266
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html

<!DOCTYPE html><title>Content of a.html.</title>

-----------------------------9051914041544843365972754266--

Đáng ngạc nhiên là, cURL sẽ gửi cùng một yêu cầu ĐĂNG như biểu mẫu trình duyệt của bạn:

nc -l localhost 8000
curl -F "text=default" -F "file1=@a.html" -F "file1=@a.txt" localhost:8000

Bạn có thể làm nhiều bài kiểm tra với:

while true; do printf '' | nc -l localhost 8000; done

41
Nội dung đáng quan tâm và không hiển nhiên ngay lập tức: boundary=---------------------------9051914041544843365972754266hai dấu gạch nối ngắn hơn ranh giới thực tế trong dữ liệu. Điều này thực sự, thực sự khó nhận thấy với tất cả các dấu gạch nối kết lại với nhau.
Fake Name

1
curl --trace-ascii <logfilename> ..... cũng tiện dụng để xem dữ liệu đã gửi và nhận.
Craig Hicks

curl -trace <logfilename> ....cũng sẽ hiển thị nhị phân. Thuận tiện để quan sát <LF> so với <CR> <LF>.
Craig Hicks

@FakeName - Ranh giới đó được tạo tự động bằng curl.
Craig Hicks

6
ranh giới luôn luôn - ngắn hơn. Mỗi dấu phân cách phần MIME (ranh giới) chứa hai dấu gạch ngang phụ ở phía trước và dấu phân cách ranh giới phía sau chứa bốn dấu gạch ngang phụ: hai dấu gạch ngang ở phía trước và hai dấu gạch ngang ở cuối.
Sergey Kuznetsov

24

Rất cám ơn câu trả lời của @Ciro Santilli! Tôi thấy rằng lựa chọn của anh ấy cho ranh giới là khá "không vui" vì tất cả các dấu gạch nối thoose: trên thực tế, như @Fake Name đã nhận xét, khi bạn đang sử dụng ranh giới bên trong yêu cầu của mình, nó có thêm hai dấu gạch nối ở phía trước:

Thí dụ:

POST / HTTP/1.1
HOST: host.example.com
Cookie: some_cookies...
Connection: Keep-Alive
Content-Type: multipart/form-data; boundary=12345

--12345
Content-Disposition: form-data; name="sometext"

some text that you wrote in your html form ...
--12345
Content-Disposition: form-data; name="name_of_post_request" filename="filename.xyz"

content of filename.xyz that you upload in your form with input[type=file]
--12345
Content-Disposition: form-data; name="image" filename="picture_of_sunset.jpg"

content of picture_of_sunset.jpg ...
--12345--

Tôi đã tìm thấy trên trang w3.org này có thể đóng gói phần tiêu đề nhiều phần / hỗn hợp trong một phần nhiều phần / biểu mẫu-dữ liệu, chỉ cần chọn một chuỗi ranh giới khác bên trong nhiều phần / hỗn hợp và sử dụng chuỗi đó để đóng gói dữ liệu. Cuối cùng, bạn phải "đóng" tất cả ranh giới được sử dụng trong FILO để đóng yêu cầu ĐĂNG (như:

POST / HTTP/1.1
...
Content-Type: multipart/form-data; boundary=12345

--12345
Content-Disposition: form-data; name="sometext"

some text sent via post...
--12345
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=abcde

--abcde
Content-Disposition: file; file="picture.jpg"

content of jpg...
--abcde
Content-Disposition: file; file="test.py"

content of test.py file ....
--abcde--
--12345--

Hãy xem liên kết ở trên.


1
Tại sao bạn không tách tất cả các thuộc tính trong Content-Dispositionvới ;?
kelin

1
'> e <ncapsulate'
Craig Hicks
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.