如果上传的文件没有扩展名,我是否必须指定 MIME 类型?换句话说,是否有默认的通用 MIME 类型?
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/unknown
,但结果肯定与 application/octet-stream
相同
application/octet-stream
或 application/unknown
提供?他们发明 image/png
是有原因的。
application/octet-stream
文件是可执行的。即使浏览器正在故意下载可执行文件,它也不会在没有用户要求的情况下“可能执行”它;仅仅下载一个可执行文件并不意味着我希望它现在就执行。如果确实有浏览器可以在下载时自动执行application/octet-stream
文件,请告诉我们是哪一个以及如何重现该行为。现在我不相信你。