关于html:enctype =’multipart / form-data’是什么意思?

What does enctype='multipart/form-data' mean?

在HTML表单中,enctype='multipart/form-data'是什么意思?我们什么时候应该使用它?


当你发出一个邮件请求时,你必须以某种方式编码构成请求体的数据。

HTML Forms提供了三种编码方法。

  • 法国国防部
  • 法国电力公司
  • text/plain

工作是在Adding application/json上完成的,但却被遗弃了。

(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将提高效率。

当你写入服务器-侧代码:

  • 使用一个预写的处理图书馆

最重要的是(如珍珠CGI->param或PHP's $_POST所展示的一个超全球性的展览)会照顾到你的不同之处。不要试图让服务器接收到的原始输入。

有时候你会发现一个图书馆无法同时处理格式。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规格中可以找到结果的一个例子。

text/plain是HTML 5引入的,只用于从SEP中解调:它们不可由计算机准确地解释,我认为其他人与工具(例如,在大多数浏览器的开发工具中的净TAB)的结合对这一点更为有利。


when should we use it

昆廷的回答是正确的:如果表单包含文件上传,则使用multipart/form-data,否则使用application/x-www-form-urlencoded,如果省略enctype,则默认使用。

我要去:

  • 添加更多的HTML5引用
  • 用一个表单提交示例解释为什么他是正确的

HTML5参考

enctype有三种可能:

  • application/x-www-form-urlencoded
  • multipart/form-data(规格指向RFC7578)
  • text/plain。这是"不可靠的计算机解释",所以它不应该在生产中使用,我们将不再深入研究它。

如何生成示例

一旦您看到每个方法的一个示例,它们的工作方式以及您应该何时使用每个方法就变得很明显了。

您可以使用以下方法生成示例:

  • nc -l或echo服务器:接受get/post请求的HTTP测试服务器
  • 像浏览器或curl这样的用户代理

将表单保存到最小的.html文件中:

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&#x03C9;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>

我们将默认文本值设置为aωb,这意味着aωb,因为ωU+03C9,这是以utf-8表示的61 CF 89 62字节。

创建要上载的文件:

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,选择文件,单击提交并检查终端。

nc打印接收到的请求。

测试日期:Ubuntu 14.04.3、ncBSD 1.105、Firefox 40。

多部分/表单数据

火狐发送:

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--

对于二进制文件和文本字段,逐字发送字节61 CF 89 62(aωb以utf-8表示)。您可以使用nc -l localhost 8000 | hd验证,它表示字节:

1
61 CF 89 62

发送(61='A'和62='B')。

因此,很明显:

  • Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266将内容类型设置为multipart/form-data并表示字段由给定的boundary字符串分隔。

  • 每个字段在其数据之前都会得到一些子标题:Content-Disposition: form-data;namefilename,然后是数据。

    服务器读取数据,直到下一个边界字符串。浏览器必须选择一个不会出现在任何字段中的边界,这就是为什么边界在请求之间可能会有所不同。

    因为我们有唯一的边界,所以不需要对数据进行编码:二进制数据按原样发送。

    TODO:找到它的算法的最佳边界大小(log(N)i赌注)和名称/运行时间是多少?请访问:https://cs.stackexchange.com/questions/39687/find-the-shortest-sequence-that-is-not-a-sub-sequence-of-a-set-of-sequences

  • Content-Type由浏览器自动确定。

    它是如何确定的?具体是在:浏览器如何确定上传文件的mime类型?

应用程序/X-WWW-FORM-URLENCODED

现在将enctype更改为application/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

很明显,文件数据没有发送,只有基名。所以这不能用于文件。

对于文本字段,我们看到像ab这样的普通可打印字符以一个字节发送,而像0xCF0x89这样的不可打印字符则各占3个字节:%CF%89

比较

文件上载通常包含大量不可打印的字符(例如图像),而文本表单几乎从不包含。

从例子中我们看到:

  • multipart/form-data:为消息添加几个字节的边界开销,必须花费一些时间计算它,但以一个字节发送每个字节。

  • application/x-www-form-urlencoded:每个字段有一个单字节边界(&),但为每个不可打印字符添加3倍的线性开销系数。

因此,即使我们可以用application/x-www-form-urlencoded发送文件,我们也不想这样做,因为它效率很低。

但是对于在文本字段中找到的可打印字符,这并不重要,并且产生的开销也更少,所以我们只使用它。


是一种编码类型,允许通过邮件输入文件。简单地说,没有这一编码就无法通过邮件发送。

如果你想让一个使用者通过一个表格上传一个文件,你必须使用这一类型。


当提交一个表格时,您通过http协议将浏览器告诉Send,一个消息在网络上,预先包装在TCP/IP协议消息结构中。一个HTML页面有一种方法可以向服务器传送数据:使用

当一个表格被提交时,一个http://request if created and sent to the server,消息将包含表格中的字段名称和用户填写的价值。这种传输可以与POSTGET发生。

  • 请告诉您的浏览器构建一个消息,并将所有内容输入到消息体(一种非常有用的做事情的方式,更多的安全,同时也灵活)。
  • Will submit the form data in the querystring.它对数据代表性和长度有一些限制。

安装如何向服务器传送您的形状

只有当使用EDOCX1时才有意义。当具体化时,它通过编码特定方式中的内容来指示浏览器传送形状。From MDN-Form Enctype:

When the value of the method attribute is post, enctype is the MIME
type of content that is used to submit the form to the server.

  • 这是防守。当表格被输入时,所有名称和值都被收集,URL编码是在最终字符串上进行的。
  • 字符串没有编码。当格式有文件上传控制时,这很重要。你想发送文件二进制和不改变位流的感觉。
  • 空间已被转换,但没有进一步的编码。

安全

When submitting forms,some security concerns can arise as stated in RFC 7578 section 7:multipart form data-security considerations:

BLCK1/

如果您是一个开发人员,您的服务器将以用户提供的形式提供,该用户可能最终包含敏感信息。


enctype='multipart/form-data'表示不编码任何字符。这就是将文件上载到服务器时使用此类型的原因。
因此,当表单需要上载二进制数据(如文件内容)时,使用multipart/form-data


将method属性设置为post,因为不能使用表单将文件内容放入URL参数中。

将enctype的值设置为multipart/form data,因为数据将被拆分为多个部分,每个文件一个部分,以及可能随它们一起发送的表单正文文本一个部分。


通常这是当你有一个需要把文件作为数据上传的帖子的时候…这将告诉服务器它将如何对传输的数据进行编码,在这种情况下,它不会被编码,因为它只会将文件传输并上载到服务器,例如上载图像或PDF时


  • enctype(encode type)属性指定表单数据提交到服务器时应如何编码。
  • multipart/form数据是enctype属性的值之一,该属性用于具有文件上载的表单元素中。多部分是指表单数据分为多个部分并发送到服务器。


The enctype attribute specifies how the form-data should be encoded when submitting it to the server.

The enctype attribute can be used only if method="post".

No characters are encoded. This value is required when you are using forms that have a file upload control

来自W3学校