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

时间:2017-10-26 11:01:52

标签: html django enctype

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

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

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

4 个答案:

答案 0 :(得分:5)

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

默认(x-www-form-urlencoded)

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

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

的multipart / form-data的

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 over multipart的原因是http请求大小的节省很少。

答案 1 :(得分:3)

来自定义multipart/form-data的{​​{3}}:

  

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

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

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

     

现在有许多表单解释程序(主要是Web浏览器)   实现并生成multipart / form-data,但是接收   应用程序可能还需要支持   "应用程序/ X WWW的窗体-urlencoded"格式。

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

  • 如果你想节省一点带宽(请记住,如果请求体被压缩,这就变得不那么重要了。)

  • 如果您需要支持那些无法处理文件上传且只知道application/x-www-form-urlencoded的旧客户,或者处理除ASCII以外的其他问题的客户。

答案 2 :(得分:2)

TL; DR

如果您针对任何现代浏览器并使用SSL来保存任何机密数据,那几乎肯定没问题。

背景

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

正如其他答案中已经提到的那样,它是一种更详细的格式,但是当您可以压缩请求或者甚至仅仅依赖于过去20年来提高的通信速度时,这也不是问题。

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

答案 3 :(得分:0)

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