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:
- Một số tham số hình thức
- Nhiều tệp
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:
Câu trả lời:
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 -l
hoặ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 .html
tệ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.
nc
in 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
boundary=---------------------------9051914041544843365972754266
là hai 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.
curl --trace-ascii <logfilename> .....
cũng tiện dụng để xem dữ liệu đã gửi và nhận.
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>.
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.
Content-Disposition
với ;
?
17.13.4 Form content types
bạn sẽ tìm thấy những gì bạn tìm kiếm.