通过更改,我发现django管理界面始终使用enctype="multipart/form-data"
。
我想采用这种模式,但我不确定我是否看到了所有后果。
为什么不总是使用enctype="multipart/form-data"
?
答案 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)
如果您针对任何现代浏览器并使用SSL来保存任何机密数据,那几乎肯定没问题。
form-data
类型最初是作为浏览器中文件上传的实验性扩展而开发的,如rfc 1867中所述。当时存在兼容性问题,但如果您的目标浏览器支持HTML 4.x并因此支持enc-type
,那么您没问题。正如您所看到的here,这对所有主流浏览器都不是问题。
正如其他答案中已经提到的那样,它是一种更详细的格式,但是当您可以压缩请求或者甚至仅仅依赖于过去20年来提高的通信速度时,这也不是问题。
最后,您还应该考虑滥用此格式的可能性。由于它是为上传文件而设计的,因此有可能在不知情的情况下使用该信息从用户的机器中提取信息,或者发送未加密的机密信息,如the HTML spec中所述。但是,现代浏览器再次变得如此强硬,如果黑客滥用这种低悬的果实而且你可以使用HTTPS获取机密数据,我会感到震惊。
答案 3 :(得分:0)
enctype
属性指定在将表单数据提交到服务器时应如何编码表单数据,并在用户想要上载文件(图像,文本文件等)时使用enctype="multipart/form-data"
服务器。