forms - 浏览器如何判断上传文件的mime类型?

标签 forms browser webforms mime-types

我有一个网络应用程序,用户需要上传 .zip 文件。在服务器端,我检查上传文件的 mime 类型,以确保它是 application/x-zip-compressedapplication/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 (kPrimaryMappingskSecondaryMappings)。

示例:当从安装了 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 行。您正在寻找 defaultMimeEntriesextraMimeEntries

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

摘要

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

关于forms - 浏览器如何判断上传文件的mime类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1201945/

相关文章:

c# - 如果另一个按钮被选中,则自动检查按钮的网络表单

c# - 循环遍历占位符中的复选框

javascript - 将按钮类型从按钮更改为提交

c++ - 如何使用 C++ 形式的 TextBox 文本?

javascript - 未捕获的安全错误 : Failed to execute 'replaceState' on 'History' in Chrome

asp.net - 有条件地排除 ASP.NET WebForms 中的 html block

php - 从 Excel 电子表格导入高级表单字段

forms - 如何在 Zend 框架 2 中禁用 inArray 验证器表单

browser - 哪些 html5 功能已经可以安全地以跨浏览器方式使用?

php - 对于某些具有 session 变量的用户,插入查询有时不起作用