我有一个网络应用程序,用户需要上传 .zip 文件。在服务器端,我检查上传文件的 mime 类型,以确保它是 application/x-zip-compressed
或 application/zip
。 p>
这对我来说在 Firefox 和 IE 上运行得很好。然而,当一位同事测试它时,它在 Firefox 上失败了(发送的 mime 类型类似于“application/octet-stream
”),但在 Internet Explorer 上却可以。我们的设置似乎是相同的:IE8、FF 3.5.1(禁用所有附加组件)、Windows XP SP3、WinRAR 作为 native .zip 文件处理程序安装(不确定这是否相关)。
所以我的问题是:浏览器如何确定要发送的 MIME 类型?
请注意:我知道 mime 类型是由浏览器发送的,因此不可靠。我只是为了方便而检查它 - 主要是为了提供比尝试将非 zip 文件作为 zip 文件打开时得到的错误消息更友好的错误消息,并避免加载(可能很重)zip 文件库。
最佳答案
Chrome
Chrome(撰写本文时为版本 38) 有 3 种方法来确定 MIME 类型,并按一定顺序执行。下面的代码片段来自文件 src/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
。
Internet Explorer
再次使用相同的示例,浏览器将报告 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 类型不可靠的原因。
关于forms - 浏览器如何判断上传文件的mime类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1201945/