如何通过浏览器确定上传文件的MIME类型?

我有一个Web应用程序,用户需要上传一个.zip文件。 在服务器端,我正在检查上传文件的MIME类型,以确保它是application/x-zip-compressedapplication/zip

这在Firefox和IE上适用于我。 然而,当一个同事测试它时,他在Firefox上失败了(发送的MIME类型就像是“ application/octet-stream ”),但在Internet Explorer上工作。 我们的设置看起来完全相同:禁用所有附件的IE8,FF 3.5.1,Win XP SP3,WinRAR作为原生.zip文件处理程序安装(不确定是否相关)。

所以我的问题是: 浏览器如何确定要发送的MIME类型?

请注意:我知道MIME类型是由浏览器发送的,因此不可靠。 我只是将它作为一种便利来检查 - 主要是为了给出比通过尝试以压缩文件的形式打开非zip文件所获得的错误信息更友好的错误消息,并避免加载(推测是重的)zip文件库。


Chrome(截至撰稿时为38版)有三种方法可以确定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: kPrimaryMappings ? kPrimaryMappings = kPrimaryMappingskPrimaryMappingskSecondaryMappings )。

例如:当从安装了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)以类似的方式工作。 从文件uriloaderexthandlernsExternalHelperAppService.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行附近。您正在寻找defaultMimeEntriesextraMimeEntries

使用我当前的配置文件,浏览器将报告text/csv因为mimeTypes.rdf有一个条目(上面列表中的条目2)。 在没有这个条目的新配置文件中,浏览器将报告application/vnd.ms-excel (列表中的项目3)。

概要

浏览器中的硬编码列表非常有限。 通常,浏览器发送的MIME类型将是操作系统报告的MIME类型。 正因如此,正如问题所述,浏览器报告的MIME类型是不可靠的。


基普,我花了一些时间阅读RFC,MSDN和MDN。 这是我能理解的。 当浏览器遇到要上传的文件时,它会查看收到的第一个数据缓冲区,然后对其执行测试。 这些测试尝试确定该文件是否是已知的MIME类型,如果已知MIME类型,它将进一步测试已知的MIME类型并据此采取行动。 我认为IE试图首先做到这一点,而不仅仅是从扩展中确定文件类型。 本页面解释了IE http://msdn.microsoft.com/en-us/library/ms775147%28v=vs.85%29.aspx。 对于firefox,我能理解的是它试图从文件系统或目录项中读取文件信息,然后确定文件类型。 这里是FF https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIFile的链接。 我仍然希望在这方面有更多的权威信息。


这可能是操作系统,也可能是浏览器依赖的,但在Windows上,给定文件扩展名的MIME类型可以通过在HKCR的注册表中找到:

例如:

HKEY_CLASSES_ROOT.zip - ContentType

要从MIME转到文件扩展名,您可以查看下面的键

HKEY_CLASSES_ROOT Mime Database Content Type

获取特定MIME类型的默认扩展名。

链接地址: http://www.djcxy.com/p/8245.html

上一篇: How is mime type of an uploaded file determined by browser?

下一篇: Changing MIME type with Meteor