铬
Chrome (撰写本文时为版本38)具有3种确定MIME类型的方式,并且以某种顺序进行。下面的代码片段来自filesrc/net/base/mime_util.cc
方法MimeUtil::GetMimeTypeFromExtensionHelper
。
// We implement the same algorithm as Mozilla for mapping a file extension to
// a mime type. That is, we first check a hard-coded list (that cannot be
// overridden), and then if not found there, we defer to the system registry.
// Finally, we scan a secondary hard-coded list to catch types that we can
// deduce but that we also want to allow the OS to override.
硬编码列表早于文件:https : //cs.chromium.org/chromium/src/net/base/mime_util.cc? l =170(kPrimaryMappings
和kSecondaryMappings
)。
例如:从装有Microsoft Excel的Windows系统上传CSV文件时,Chrome会将其报告为application/vnd.ms-excel
。这是因为.csv
未在第一个硬编码列表中指定,因此浏览器将退回到系统注册表。HKEY_CLASSES_ROOT\.csv
有一个名为的值Content Type
,设置为application/vnd.ms-excel
。
IE浏览器
再次使用相同的示例,浏览器将报告application/vnd.ms-excel
。我认为假设Internet Explorer (撰写本文时为版本11)使用注册表是合理的。可能还使用了Chrome和Firefox等硬编码列表,但其封闭的源代码性质使其难以验证。
火狐浏览器
如Chrome代码所示,Firefox (撰写本文时为32版)的工作方式类似。文件片段uriloader\exthandler\nsExternalHelperAppService.cpp
,方法nsExternalHelperAppService::GetTypeFromExtension
// OK. We want to try the following sources of mimetype information, in this order:
// 1. defaultMimeEntries array
// 2. User-set preferences (managed by the handler service)
// 3. OS-provided information
// 4. our "extras" array
// 5. Information from plugins
// 6. The "ext-to-type-mapping" category
硬编码列表位于文件中较早的位置,位于441行附近。您正在寻找defaultMimeEntries
和extraMimeEntries
。
使用我当前的个人资料,浏览器将报告,text/csv
因为在其中有一个条目mimeTypes.rdf
(上面列表中的项目2)。使用没有该条目的新配置文件,浏览器将报告application/vnd.ms-excel
(列表中的项目3)。
概要
浏览器中的硬编码列表非常有限。通常,浏览器发送的MIME类型将是操作系统报告的一种。正如问题中所指出的,这正是为什么浏览器报告的MIME类型不可靠的原因。