【问题标题】:Why not use enctype="multipart/form-data" always?为什么不总是使用 enctype="multipart/form-data" ?
【发布时间】:2018-04-07 17:38:29
【问题描述】:

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

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

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

更新

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

【问题讨论】:

  • 在我看来multipart/form-data 最好用于文件上传和传输,因为在整个请求过程中不会对字符进行编码。当您使用具有文件上传控件的表单时需要此值手application/x-www-form-urlencoded用于在发送前对所有字符进行编码(空格转换为“+”符号,特殊字符转换为ASCII HEX值)。
  • @AnkitChaudhary 我尽量避免条件。我喜欢它简单明了。这就是问题所在:为什么不总是使用它。我在你的评论中找不到这个问题的答案。如果我忽略了,请详细说明。
  • @AnkitChaudhary 你提供了一个链接。我认为“enctype='multipart/form-data' 是什么意思?”是一个不同的问题。

标签: html django enctype


【解决方案1】:

来自定义multipart/form-dataRFC

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

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

但是,没有机会用 内容类型、应用字符集或使用其他编码机制。

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

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

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

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

【讨论】:

  • 我不需要支持真正的老客户。而且我认为带宽开销非常小。谢谢你的回答。
【解决方案2】:

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 请求大小。

【讨论】:

    【解决方案3】:

    TL;博士

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

    背景

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 是的,你写的每一个字都是真的。但它没有回答这个问题。 AFAIK 如果你总是使用 enctype="multipart/form-data" 并没有什么坏处。这就是问题所在。
      猜你喜欢
      • 2010-11-05
      • 2017-12-17
      • 2022-06-25
      • 2023-04-03
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多