10

通过更改,我发现 django 管理界面enctype="multipart/form-data"总是使用。

我想采用这种模式,但我不确定我是否看到了这种模式的所有后果。

为什么不enctype="multipart/form-data"总是使用?

更新

一年多以来,我们enctype="multipart/form-data"总是以某种形式使用。工作正常。

4

4 回答 4

10

来自定义的RFCmultipart/form-data

许多 Web 应用程序使用“application/x-www-form-urlencoded”方法从表单返回数据。这种格式非常紧凑,例如:

name=Xavier+Xantico&verdict=Yes&colour=Blue&happy=sad&Utf%F6r=Send

但是,没有机会用内容类型标记封闭的数据、应用字符集或使用其他编码机制。

许多表单解释程序(主要是 Web 浏览器)现在实现并生成 multipart/form-data,但接收应用程序可能还需要支持“application/x-www-form-urlencoded”格式。

除了让您上传文件外,multipart/form-data还允许您使用其他字符集和编码机制。所以不使用它的唯一原因是:

  • 如果您想节省一点带宽(请记住,如果请求正文被压缩,这将不再是一个问题)。

  • 如果您需要支持无法处理文件上传并且只知道的真正旧客户端application/x-www-form-urlencoded,或者在处理 ASCII 以外的任何内容时遇到问题。

于 2017-11-01T09:29:56.783 回答
7

使用multipart/form-data简单的文本表单会产生一些开销。将简单的表格与姓名和电子邮件进行比较。

默认(x-www-form-urlencoded)

Content-Type: application/x-www-form-urlencoded; charset=utf-8

name=Nomen+Nescio&email=foo%40bar.com

多部分/表单数据

Content-Type: multipart/form-data; boundary=96a188ad5f9d4026822dacbdde47f43f

--96a188ad5f9d4026822dacbdde47f43f
Content-Disposition: form-data; name="name"

Nomen Nescio
--96a188ad5f9d4026822dacbdde47f43f
Content-Disposition: form-data; name="email"

foo@bar.com
--96a188ad5f9d4026822dacbdde47f43f

如您所见,当使用多部分编码时,您需要在正文中传输一堆额外的字节(本例中为 37 字节 vs 252 字节)

但是,当您添加 http 标头并应用压缩时,在大多数实际情况下,有效负载的相对差异会小得多。

喜欢 urlencoded 而不是 multipart 的原因是在 http 请求大小上节省了一点点。

于 2017-10-30T15:45:52.467 回答
5

TL; 博士

如果您针对任何现代浏览器并使用 SSL 处理任何机密数据,几乎可以肯定没有问题。

背景

form-data类型最初是作为浏览器中文件上传的实验性扩展开发的,如rfc 1867中所述。当时存在兼容性问题,但如果您的目标浏览器支持 HTML 4.x 并因此支持enc-type. 正如您在此处看到的,这对于所有主流浏览器来说都不是问题。

正如其他答案中已经指出的那样,它是一种更冗长的格式,但是当您可以压缩请求甚至仅仅依靠过去 20 年改进的通信速度时,这也不是问题。

最后,您还应该考虑滥用这种格式的可能性。由于它是为上传文件而设计的,因此它有可能被用于在用户不知情的情况下从用户的机器中提取信息,或者发送未加密的机密信息,如HTML 规范中所述。然而,再一次,现代浏览器是如此坚固,如果让黑客滥用这种低调的果实并且您可以使用 HTTPS 来获取机密数据,我会感到震惊。

于 2017-11-04T16:11:49.223 回答
-1

enctype属性指定表单数据在提交到服务器时应如何编码,并enctype="multipart/form-data"在用户想要将文件(图像、文本文件等)上传到服务器时使用。

于 2017-10-26T11:14:51.643 回答