What does enctype='multipart/form-data' mean?
在HTML表单中,
当你发出一个邮件请求时,你必须以某种方式编码构成请求体的数据。
HTML Forms提供了三种编码方法。
- 法国国防部
- 法国电力公司
text/plain
工作是在Adding
(Other encodings are possible with http://requests generated using other means than an HTML form submission.)
The specifics of the formats don't matter to most developers.The important points are:
- 从不使用EDOCX1
当你写客户代码时
- 当你的表格包含任何EDOCX1元素时
- 除此之外,您可以使用EDOCX1或EDOCX1,但
application/x-www-form-urlencoded 将提高效率。
当你写入服务器-侧代码:
- 使用一个预写的处理图书馆
最重要的是(如珍珠
有时候你会发现一个图书馆无法同时处理格式。Node.js's most popular library for handling form data is body-parser which cannot handle multipart requests(but has documentation which recommends some alternatives which can).
如果你是写作(或解码)一个图书馆,用于填写或生成原始数据,那么你就需要开始担心格式。你可能还想知道这件事,因为有兴趣喝一杯。
在URL的结尾,这是一个越来越少或更少的字符串。
更复杂的是,它允许整个文件包含在数据中。在HTML 4规格中可以找到结果的一个例子。
when should we use it
昆廷的回答是正确的:如果表单包含文件上传,则使用
我要去:
- 添加更多的HTML5引用
- 用一个表单提交示例解释为什么他是正确的
HTML5参考
application/x-www-form-urlencoded multipart/form-data (规格指向RFC7578)text/plain 。这是"不可靠的计算机解释",所以它不应该在生产中使用,我们将不再深入研究它。
如何生成示例
一旦您看到每个方法的一个示例,它们的工作方式以及您应该何时使用每个方法就变得很明显了。
您可以使用以下方法生成示例:
nc -l 或echo服务器:接受get/post请求的HTTP测试服务器- 像浏览器或curl这样的用户代理
将表单保存到最小的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"/> upload </head> <body> <form action="http://localhost:8000" method="post" enctype="multipart/form-data"> <p> <input type="text" name="text1" value="text default"> <p> <input type="text" name="text2" value="aωb"> <p> <input type="file" name="file1"> <p> <input type="file" name="file2"> <p> <input type="file" name="file3"> <p> <button type="submit">Submit</button> </form> </body> </html> |
我们将默认文本值设置为
创建要上载的文件:
1 2 3 4 5 6 | echo 'Content of a.txt.' > a.txt echo '<!DOCTYPE html>Content of a.html.' > a.html # Binary file containing 4 bytes: 'a', 1, 2 and 'b'. printf 'a\xCF\x89b' > binary |
运行我们的小echo服务器:
1 | while true; do printf '' | nc -l 8000 localhost; done |
打开浏览器上的HTML,选择文件,单击提交并检查终端。
测试日期:Ubuntu 14.04.3、
火狐发送:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | POST / HTTP/1.1 [[ Less interesting headers ... ]] Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150 Content-Length: 834 -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="text1" text default -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="text2" aωb -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file1"; filename="a.txt" Content-Type: text/plain Content of a.txt. -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file2"; filename="a.html" Content-Type: text/html <!DOCTYPE html>Content of a.html. -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file3"; filename="binary" Content-Type: application/octet-stream aωb -----------------------------735323031399963166993862150-- |
对于二进制文件和文本字段,逐字发送字节
1 | 61 CF 89 62 |
发送(
因此,很明显:
Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266 将内容类型设置为multipart/form-data 并表示字段由给定的boundary 字符串分隔。每个字段在其数据之前都会得到一些子标题:
Content-Disposition: form-data; ,name ,filename ,然后是数据。服务器读取数据,直到下一个边界字符串。浏览器必须选择一个不会出现在任何字段中的边界,这就是为什么边界在请求之间可能会有所不同。
因为我们有唯一的边界,所以不需要对数据进行编码:二进制数据按原样发送。
TODO:找到它的算法的最佳边界大小(
log(N) i赌注)和名称/运行时间是多少?请访问:https://cs.stackexchange.com/questions/39687/find-the-shortest-sequence-that-is-not-a-sub-sequence-of-a-set-of-sequencesContent-Type 由浏览器自动确定。它是如何确定的?具体是在:浏览器如何确定上传文件的mime类型?
应用程序/X-WWW-FORM-URLENCODED
现在将
火狐发送:
1 2 3 4 5 6 | POST / HTTP/1.1 [[ Less interesting headers ... ]] Content-Type: application/x-www-form-urlencoded Content-Length: 51 text1=text+default&text2=a%CF%89b&file1=a.txt&file2=a.html&file3=binary |
很明显,文件数据没有发送,只有基名。所以这不能用于文件。
对于文本字段,我们看到像
文件上载通常包含大量不可打印的字符(例如图像),而文本表单几乎从不包含。
从例子中我们看到:
multipart/form-data :为消息添加几个字节的边界开销,必须花费一些时间计算它,但以一个字节发送每个字节。application/x-www-form-urlencoded :每个字段有一个单字节边界(& ),但为每个不可打印字符添加3倍的线性开销系数。
因此,即使我们可以用
但是对于在文本字段中找到的可打印字符,这并不重要,并且产生的开销也更少,所以我们只使用它。
是一种编码类型,允许通过邮件输入文件。简单地说,没有这一编码就无法通过邮件发送。
如果你想让一个使用者通过一个表格上传一个文件,你必须使用这一类型。
当提交一个表格时,您通过http协议将浏览器告诉Send,一个消息在网络上,预先包装在TCP/IP协议消息结构中。一个HTML页面有一种方法可以向服务器传送数据:使用