Site icon Blog Dương Trạng

Enctype = ‘Multipart / form-data’ nghĩa là gì?

khi nào chúng ta nên sử dụng nó

Câu trả lời của Quentin là đúng: sử dụng multipart/form-datanếu biểu mẫu có chứa tệp tải lên và utility/x-www-form-urlencodednếu không, đó là mặc định nếu bạn bỏ qua enctype.

Tôi sẽ:

Tài liệu tham khảo HTML5

Có ba khả năng cho enctype:

Cách tạo các ví dụ

Khi bạn thấy một ví dụ về mỗi phương thức, nó sẽ trở nên rõ ràng về cách chúng hoạt động và khi nào bạn nên sử dụng từng phương thức.

Bạn có thể tạo các ví dụ bằng cách sử dụng:

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

<!DOCTYPE html> <html lang=”en”> <head> <meta charset=”utf-8″/> <title>add</title> </head> <physique> <kind motion=”http://localhost:8000″ technique=”submit” enctype=”multipart/form-data”> <p><enter sort=”textual content” title=”text1″ worth=”textual content default”> <p><enter sort=”textual content” title=”text2″ worth=”aωb”> <p><enter sort=”file” title=”file1″> <p><enter sort=”file” title=”file2″> <p><enter sort=”file” title=”file3″> <p><button sort=”submit”>Submit</button> </kind> </physique> </html>

Chúng tôi thiết lập các giá trị văn bản mặc định aωb, có nghĩa là aωbbởi vì ωlà U+03C9, đó là các byte 61 CF 89 62trong UTF-8.

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

echo ‘Content material of a.txt.’ > a.txt echo ‘<!DOCTYPE html><title>Content material of a.html.</title>’ > a.html # Binary file containing 4 bytes: ‘a’, 1, 2 and ‘b’. printf ‘axCFx89b’ > binary

Chạy máy chủ echo nhỏ của chúng tôi:

whereas true; do printf ” | nc -l 8000 localhost; performed

Mở HTML trên trình duyệt của bạn, chọn các 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.

Đã thử nghiệm trên: Ubuntu 14.04.3, ncBSD 1.105, Firefox 40.

nhiều dữ liệu / biểu mẫu

Firefox đã gửi:

POST / HTTP/1.1 [[ Less interesting headers … ]] Content material-Kind: multipart/form-data; boundary=-735323031399963166993862150 Content material-Size: 834 -735323031399963166993862150 Content material-Disposition: form-data; title=”text1″ textual content default -735323031399963166993862150 Content material-Disposition: form-data; title=”text2″ aωb -735323031399963166993862150 Content material-Disposition: form-data; title=”file1″; filename=”a.txt” Content material-Kind: textual content/plain Content material of a.txt. -735323031399963166993862150 Content material-Disposition: form-data; title=”file2″; filename=”a.html” Content material-Kind: textual content/html <!DOCTYPE html><title>Content material of a.html.</title> -735323031399963166993862150 Content material-Disposition: form-data; title=”file3″; filename=”binary” Content material-Kind: utility/octet-stream aωb -735323031399963166993862150-

Đối với tệp nhị phân và trường văn bản, các byte 61 CF 89 62( aωbtrong UTF-8) được gửi theo nghĩa đen. Bạn có thể xác minh rằng với nc -l localhost 8000 | hd, nói rằng các byte:

61 CF 89 62

đã được gửi ( 61== ‘a’ và 62== ‘b’).

Vì vậy, rõ ràng rằng:

ứng dụng / x-www-form-urlencoding

Bây giờ thay đổi enctypethành utility/x-www-form-urlencoded, tải lại trình duyệt và gửi lại.

Firefox đã gửi:

POST / HTTP/1.1 [[ Less interesting headers … ]] Content material-Kind: utility/x-www-form-urlencoded Content material-Size: 51 text1=textual content+default&text2=apercentCFpercent89b&file1=a.txt&file2=a.html&file3=binary

Rõ ràng dữ liệu tệp không được gửi, chỉ có các tên cơ sở. Vì vậy, điều này không thể được sử dụng cho các tập tin.

Đối với trường văn bản, chúng tôi thấy rằng các ký tự có thể in thông thường như avà bđược gửi trong một byte, trong khi các ký tự không in được như thế 0xCFvà 0x89chiếm 3 byte mỗi ký tự : %CFpercent89!

So sánh

Tải lên tệp thường chứa nhiều ký tự không in được (ví dụ hình ảnh), trong khi các hình thức văn bản hầu như không bao giờ thực hiện.

Từ các ví dụ chúng ta đã thấy rằng:

Do đó, ngay cả khi chúng tôi có thể gửi tệp cùng utility/x-www-form-urlencoded, chúng tôi sẽ không muốn, vì nó rất kém hiệu quả.

Nhưng đối với các ký tự có thể in được tìm thấy trong các trường văn bản, nó không quan trọng và tạo ra ít chi phí hơn, vì vậy chúng tôi chỉ sử dụng nó.

Exit mobile version