Forms 浏览器如何确定上传文件的mime类型?

Forms 浏览器如何确定上传文件的mime类型?,forms,browser,webforms,mime-types,Forms,Browser,Webforms,Mime Types,我有一个web应用程序,用户需要上传一个.zip文件。在服务器端,我正在检查上传文件的mime类型,以确保它是application/x-zip-compressed或application/zip 这对我来说在Firefox和IE上很好。然而,当一位同事测试它时,他在Firefox上失败了(发送的mime类型类似于“application/octet stream”),但在Internet Explorer上工作。我们的设置似乎是相同的:IE8,FF 3.5.1,禁用所有附加组件,Win XP

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

这对我来说在Firefox和IE上很好。然而,当一位同事测试它时,他在Firefox上失败了(发送的mime类型类似于“
application/octet stream
”),但在Internet Explorer上工作。我们的设置似乎是相同的:IE8,FF 3.5.1,禁用所有附加组件,Win XP SP3,WinRAR作为本机.zip文件处理程序安装(不确定是否相关)

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


请注意:我知道mime类型是由浏览器发送的,因此不可靠。我只是为了方便起见才检查它——主要是为了给出一条比试图将非zip文件作为zip文件打开时得到的更友好的错误消息,并避免加载(可能很重的)zip文件库。

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

例如:

HKEY_CLASSES_ROOT.zip -内容类型

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

HKEY\U CLASSES\U ROOT\Mime\Database\Content Type


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

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

例如:

HKEY_CLASSES_ROOT.zip -内容类型

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

HKEY\U CLASSES\U ROOT\Mime\Database\Content Type


为了获得特定MIME类型的默认扩展名。

Kip,我花了一些时间阅读RFCs、MSDN和MDN。这是我能理解的。当浏览器遇到要上载的文件时,它会查看接收到的第一个数据缓冲区,然后对其运行测试。这些测试试图确定文件是否为已知的mime类型,如果为已知的mime类型,则只需进一步测试已知的mime类型,并采取相应的措施。我认为IE会首先尝试这样做,而不仅仅是根据扩展名确定文件类型。本页为IE解释了这一点。对于firefox,我能理解的是它试图从文件系统或目录条目中读取文件信息,然后确定文件类型。这里是FF的链接。我仍然想知道关于这方面更权威的信息。

Kip,我花了一些时间阅读了RFC、MSDN和MDN。这是我能理解的。当浏览器遇到要上载的文件时,它会查看接收到的第一个数据缓冲区,然后对其运行测试。这些测试试图确定文件是否为已知的mime类型,如果为已知的mime类型,则只需进一步测试已知的mime类型,并采取相应的措施。我认为IE会首先尝试这样做,而不仅仅是根据扩展名确定文件类型。本页为IE解释了这一点。对于firefox,我能理解的是它试图从文件系统或目录条目中读取文件信息,然后确定文件类型。这里是FF的链接。我仍然想知道关于这个问题的更权威的信息。

虽然这不是对你问题的回答,但它确实解决了你试图解决的问题。YMMV

正如您所写的,mime类型是不可靠的,因为每个浏览器都有自己的确定方法。但是,浏览器会发送文件的原始名称(包括扩展名)。所以处理这个问题的最好方法是检查文件的扩展名,而不是MIME类型


如果仍然需要mime类型,则可以使用自己的apache的mime.types来确定服务器端的mime类型

虽然这不是你问题的答案,但它确实解决了你试图解决的问题。YMMV

正如您所写的,mime类型是不可靠的,因为每个浏览器都有自己的确定方法。但是,浏览器会发送文件的原始名称(包括扩展名)。所以处理这个问题的最好方法是检查文件的扩展名,而不是MIME类型


如果仍然需要mime类型,则可以使用自己的apache的mime.types来确定服务器端的mime类型

我同意Johndoo的观点,有太多的变量使得浏览器发送的mime类型不可靠。我将排除接收到的子类型,只关注“application”之类的类型。如果您的应用程序是基于php的,则可以使用函数explode()轻松完成此操作。
此外,只需检查文件扩展名,以确保它是.zip或任何其他压缩您正在寻找

我同意Johndoo的观点,有太多的变量使得浏览器发送的mime类型不可靠。我将排除接收到的子类型,只关注“application”之类的类型。如果您的应用程序是基于php的,则可以使用函数explode()轻松完成此操作。 此外,只需检查文件扩展名,以确保它是.zip或任何其他压缩您正在寻找

铬 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.
硬编码列表在文件中出现得稍早一些:(
kPrimaryMappings
kSecondaryMappings

例如:当从安装了Microsoft Excel的Windows系统上载CSV文件时,Chrome会将此报告为
application/vnd.ms Excel
。这是因为第一个硬编码列表中未指定
.csv
,因此浏览器会返回到系统注册表
HKEY\U CLASSES\U ROOT\.csv
有一个名为
Content Type
的值,该值设置为
app
// 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