未知的文件类型MIME?

Shi*_*mmy 134 mime default-value mime-types

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

Bom*_*mbe 175

您可以使用application/octet-stream未知类型.

RFC 2046在4.5.1节中说明:

"八位字节流"子类型用于指示正​​文包含任意二进制数据.

  • "任意二进制数据"不是"未知".通过使用application/octet-stream,您告诉浏览器内容类型是已知的,不是文本也不是图像,而是任意二进制数据,因此应该下载到文件并可能执行.除了错误之外,这是一个安全漏洞,特别是考虑到几乎看不见的现代下载管理器.正确的答案是没有内容类型标题.如果您不知道它是哪种文件,浏览器可能会知道它,所以让它猜测,特别是当它知道使用的上下文(图像,文档,脚本......)时 (4认同)
  • 实际上,根据RFC,您不应发送任何包含未知数据的类型信息.RFC-2046仅定义已知类型,但RFC-7231告诉您如何处理未知类型. (3认同)

Sam*_*ala 35

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标头字段,除非 发送方
不知道所包含的表示的预期媒体类型
.

该部分明确告诉您如果您不确定,请将其遗漏.它还告诉接收者可以假设该类型是application/octet-stream但事情是它也可能是其他东西.

有什么不同呢?

RFC-2046
4.5.1.Octet-Stream子类型

接收
"application/octet-stream"实体的实现的建议操作是简单地提供将数据
放入文件中,其中任何Content-Transfer-Encoding撤消,或者可能将
其用作用户指定的输入处理.

并且,如上所述:

RFC-7231
3.1.1.5.内容类型

如果Content-Type头字段不存在,则接收者可以采用媒体类型"application/octet-stream"
([RFC2046],第4.5.1节)或检查数据以确定其类型.

结论:

如果您将其定义为"application/octet-stream",那么您告诉您知道它是"application/octet-stream".

如果你没有定义它,那么你告诉你不知道它是什么,然后决定接收器和接收器然后可以检查它是否像鸭子一样行走......


小智 13

我更喜欢application/unknown,但结果肯定是一样的application/octet-stream

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