Html 为什么不使用enctype=";“多部分/表单数据”;总是吗?

Html 为什么不使用enctype=";“多部分/表单数据”;总是吗?,html,django,enctype,Html,Django,Enctype,通过更改,我发现django管理接口总是使用enctype=“multipart/form data” 我想采用这种模式,但我不确定我是否看到了这一切后果 为什么不始终使用enctype=“多部分/表单数据” 更新 由于一年多以来,我们总是在某些表单中使用enctype=“多部分/表单数据”。工作正常。属性指定在将表单数据提交到服务器时应如何对表单数据进行编码,并且在用户希望上载文件(图像、文本文件等)时使用enctype=“multipart/form data”到服务器。对于简单的文本表单,

通过更改,我发现django管理接口总是使用
enctype=“multipart/form data”

我想采用这种模式,但我不确定我是否看到了这一切后果

为什么不始终使用
enctype=“多部分/表单数据”

更新
由于一年多以来,我们总是在某些表单中使用
enctype=“多部分/表单数据”
。工作正常。

属性指定在将表单数据提交到服务器时应如何对表单数据进行编码,并且在用户希望上载文件(图像、文本文件等)时使用
enctype=“multipart/form data”
到服务器。

对于简单的文本表单,使用
多部分/表单数据
会有一些开销。将简单表单与姓名和电子邮件进行比较

默认值(x-www-form-urlencoded)

多部分/表单数据

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的原因是http请求大小的一小部分节省。

来自定义多部分/表单数据的:

许多web应用程序使用“application/x-www-form-urlencoded” 用于从窗体返回数据的方法。这种格式很紧凑, 例如:

name=Xavier+Xantico&verdict=Yes&colour=Blue&happy=sad&Utf%F6r=Send
但是,没有机会用标签标记随附数据 内容类型、应用字符集或使用其他编码机制

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

除了允许您上传文件外,
多部分/表单数据
还允许您使用其他字符集和编码机制。因此,不使用它的唯一原因是:

  • 如果您想节省一点带宽(请记住,如果请求正文被压缩,那么这就不是什么问题了)

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

TL;博士 如果您以任何现代浏览器为目标,并对任何机密数据使用SSL,几乎可以肯定不会有问题

背景
表单数据
类型最初是作为浏览器中文件上传的实验扩展而开发的,如中所述。当时存在兼容性问题,但是如果您的目标浏览器支持HTML4.x,因此支持
enc类型
,您就可以了。正如你所看到的,这并不是所有主流浏览器都会遇到的问题

正如在其他答案中已经指出的,它是一种更为详细的格式,但当您可以压缩请求,甚至仅仅依靠过去20年来通信速度的提高时,这也不是问题


最后,你也应该考虑滥用这种格式的可能性。由于它是为了上传文件而设计的,因此它有可能被用于在用户不知情的情况下从用户的机器中提取信息,或者发送未加密的机密信息,如中所述。然而,现代浏览器又一次变得如此老于世故,如果这样的低效成果被黑客滥用,你可以使用HTTPS获取机密数据,我会感到震惊。

是的,你写的每一个字都是真的。但它并没有回答这个问题。AFAIK如果总是使用enctype=“multipart/form data”,则不会造成任何伤害。这就是问题所在。我不需要支持真正的老客户。我认为头顶上的带子很小。谢谢您的回答。在我看来,
多部分/表单数据
是文件上传和传输的最佳用途,因为在整个请求过程中不会对字符进行编码。当您使用具有文件上传控件的表单时,此值是必需的,而在其他情况下,
应用程序/x-www-form-urlencoded
用于对所有数据进行编码发送前的字符(空格转换为“+”符号,特殊字符转换为ASCII十六进制值)。@AnkitChaudhary我试图避免出现这种情况。我喜欢简单明了。这就是问题所在:为什么不经常使用它呢。我在你的评论中找不到这个问题的答案。如果我忽略了它,请详细说明。@AnkitChaudhary您提供了一个链接。我认为“enctype='multipart/formdata'是什么意思?”是另一个问题。
name=Xavier+Xantico&verdict=Yes&colour=Blue&happy=sad&Utf%F6r=Send