ChatGPT解决这个技术问题 Extra ChatGPT

未知文件类型 MIME?

如果上传的文件没有扩展名,我是否必须指定 MIME 类型?换句话说,是否有默认的通用 MIME 类型?


B
Bombe

您可以将 application/octet-stream 用于未知类型。

RFC 2046 第 4.5.1 节中的状态:

“八位字节流”子类型用于指示主体包含任意二进制数据。


实际上,根据 RFC,您不应该发送任何带有未知数据的类型信息。 RFC-2046 仅定义已知类型,但 RFC-7231 告诉您如何处理未知类型。
@SampoSarrala 我对 RFC-7231 的阅读略有不同:“如果 Content-Type 标头字段不存在,则接收者可以假定媒体类型为“application/octet-stream”([RFC2046],第 4.5.1 节)或检查数据以确定其类型。”我解释说,如果我们不希望客户玩带有内容检查的猜谜游戏,我们应该发送 NO Content-Type 或者我们可以安全地发送 application/octet-stream 作为默认值。
@Jpnh 是的,没错。 Content-Type 标头在未知时不应出现。还可以发送 application/octet-stream ,它基本上告诉客户端“您现在不想显示它,而是继续将这些字节保存到文件中”。这使得网络客户端提供保存文件。选项 1 == 对此文件一无所知。选项 2 == 无法使用 mime 描述文件内容,或者只能将其保存到磁盘。在实践中,任何一个选项都是正确的。我应该选择更好的措辞以避免混淆。
“任意二进制数据”不是“未知”。通过使用 application/octet-stream 你告诉浏览器内容类型是已知的,不是文本也不是图像,而是任意二进制数据,因此应该下载到文件并可能执行。除了错误之外,这是一个安全漏洞,尤其是考虑到几乎不可见的现代下载管理器。正确的答案是没有内容类型的标题。如果您不知道它是哪种文件,浏览器可能知道它,所以让它猜测,尤其是当它知道使用的上下文(图像、文档、脚本……)时
@FF_Dev 我敢肯定那是胡说八道。 “任意二进制数据”并不意味着“可执行”;浏览器(或下载管理器)没有理由假定 application/octet-stream 文件是可执行的。即使浏览器正在故意下载可执行文件,它也不会在没有用户要求的情况下“可能执行”它;仅仅下载一个可执行文件并不意味着我希望它现在就执行。如果确实有浏览器可以在下载时自动执行 application/octet-stream 文件,请告诉我们是哪一个以及如何重现该行为。现在我不相信你。
C
Community

RFC 资源:

我们应该使用 RFC-7231(HTTP/1.1 语义和内容)而不是 RFC-2046(媒体类型)作为参考,因为问题显然是关于 HTTP Content-Type。

RFC-2046 也没有明确定义未知类型,但 RFC-7231 有。

简短的回答:

不要为未知数据发送 MIME 类型。更清楚一点:根本不要使用 Content-Type 标头。

参考:

RFC-7231 超文本传输协议 (HTTP/1.1):语义和内容 3.1.1.5。 Content-Type 生成包含有效负载正文的消息的发送者应该在该消息中生成 Content-Type 头字段,除非发送者不知道封闭表示的预期媒体类型。

该部分清楚地告诉您,如果您不确定,请忽略它。它还告诉接收者可以假设类型是 application/octet-stream 但事情是它也可能是其他东西。

那有什么不同呢?

RFC-2046 4.5.1。 Octet-Stream 子类型 对于接收“application/octet-stream”实体的实现,推荐的操作是简单地将数据放入文件中,取消任何 Content-Transfer-Encoding,或者将其用作输入用户指定的过程。

而且,如上所述:

RFC-7231 3.1.1.5。 Content-Type 如果 Content-Type 头域不存在,接收者可以假设媒体类型为“application/octet-stream”([RFC2046],第 4.5.1 节)或检查数据以确定其类型。

结论:

如果您将其定义为“application/octet-stream”,那么您就是在告诉您知道它是“application/octet-stream”。

如果您不定义它,那么您就是在告诉您不知道它是什么,然后将决定留给接收者,然后接收者可以检查它是否像鸭子一样走路并且...


这个答案值得赞成,因为它是唯一的真理。此外,默认情况下使用“application/octet-stream”会使大多数浏览器触发下载,考虑到几乎不可见的现代下载管理器,这是一个安全漏洞。
这对 HTTP 来说是正确的,但问题一般是关于 MIME,而不是关于 HTTP。例如,在电子邮件中,规则就完全不同了。另请参阅建议重复 stackoverflow.com/questions/12539058/… 中的讨论
出于同样的原因,我给出了一个提升,但我同意 FF_Dev。除非意图是“应用程序/八位字节流”并触发下载,否则需要“应用程序/未知”。如果没有设置“Content-Disposition”,浏览器不会尝试下载文件会很好,但是有太多网站在没有设置文件名的情况下随意下载文件。尤其是银行。
L
Lada

我更喜欢 application/unknown,但结果肯定与 application/octet-stream 相同


是否有允许使用 application/unknown 代替 application/octet-stream 的标准?
谢谢! application/unknown 运行良好,八位字节流在我的示例 png 文件中导致 chrome 出现错误!
为什么将 .png 文件作为 application/octet-streamapplication/unknown 提供?他们发明 image/png 是有原因的。
@jenson-button-event 这与重新发明轮子无关。 MIME 类型指定您的意图。如果您知道要发送的内容应该是 png 图像,请传递该信息。如果字节意外地表示 jpeg,您的应用程序可以警告您它不是有效的 png,并且您在其他地方有错误。此外,并非所有应用程序都像浏览器一样健壮和容错。它们旨在修复程序员的错误,但这远不是它的唯一目的。浏览器不是唯一使用 MIME 类型的应用程序。
你的参考是什么?未知类型没有提供有关文件内容或状态的任何信息,或者即使它是基于二进制或文本的,对于生产代码来说也太模糊了,对于小型项目来说可能没问题,因为如果文件 mimetype 没有在操作系统中的处理程序,它本质上是一个可下载的二进制文件,并且 unknown 类型是 Windows 操作系统中的已知句柄,您可以为其分配一个操作(例如用记事本打开未知文件)。虽然是不好的做法,但您可以将未知类型与 this 结合使用来跳过任何执行:/