为啥 Urlmon.dll 中的 FindMimeFromData 函数为许多文件类型返回 MIME 类型“application/octet-stream”?

Posted

技术标签:

【中文标题】为啥 Urlmon.dll 中的 FindMimeFromData 函数为许多文件类型返回 MIME 类型“application/octet-stream”?【英文标题】:Why does the FindMimeFromData function from Urlmon.dll return MIME type “application/octet-stream” for many file types?为什么 Urlmon.dll 中的 FindMimeFromData 函数为许多文件类型返回 MIME 类型“application/octet-stream”? 【发布时间】:2011-06-17 12:21:24 【问题描述】:

为什么 Urlmon.dll 中的 FindMimeFromData 函数会为许多文件类型返回 MIME 类型“application/octet-stream”,而通过文件扩展名检查 MIME 类型(即针对 Windows 注册表)返回更精确的类型?

例如,mp3 是“application/octet-stream”而不是“audio/mp3”。

基本上,我想验证一个扩展名不正确的上传文件。此方法似乎适用于许多图像文件、xml 等。

问题类似于this one,但提供的解决方案不适合验证上传的文件,因为返回的 MIME 类型不同/不明确。

【问题讨论】:

【参考方案1】:

阅读FindMimeFromData 的文档将我带到MIME Type Detection in Internet Explorer。根据该信息,很难找到26 different MIME types,这在当今世界相当小。 “音频/mp3”不是其中之一。

FindMimeFromData 包含针对(目前 26 个)独立 MIME 类型的硬编码测试(请参阅已知 MIME 类型)。这意味着如果给定缓冲区包含这些 MIME 类型之一格式的数据,则 FindMimeFromData 中存在一个测试,该测试旨在(通过扫描缓冲区内容)识别相应的 MIME 类型。如果一个 MIME 类型是这些 N 个 MIME 类型之一,那么它就是已知的。如果 MIME 类型是“text/plain”、“application/octet-stream”、空字符串或 null(即服务器未能提供),则 MIME 类型不明确。

不幸的是,FindMimeFromData 似乎对于确定现代 MIME 类型不是很有用。

【讨论】:

【参考方案2】:

这里有一个很好的解决方案:https://***.com/a/9435701/74585 如果 FindMimeFromData 返回 "application/octet-stream" "text/plain" 或什么都不返回,它会尝试从注册表中确定文件类型(通过文件扩展名?)。

这是一个 .NET 文件类型检测库 http://filetypedetective.codeplex.com/,但它目前只检测到少量文件。

【讨论】:

以上是关于为啥 Urlmon.dll 中的 FindMimeFromData 函数为许多文件类型返回 MIME 类型“application/octet-stream”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Urlmon.dll 中的 FindMimeFromData 函数为许多文件类型返回 MIME 类型“application/octet-stream”?

为啥 Urlmon.dll 中的 FindMimeFromData 函数为许多文件类型返回 MIME 类型“application/octet-stream”?

为啥 Urlmon.dll 中的 FindMimeFromData 函数为许多文件类型返回 MIME 类型“application/octet-stream”?

替代 Urlmon.dll 中的 FindMimeFromData 方法,该方法具有更多 MIME 类型

urlmon.dll FindMimeFromData() 在 64 位桌面/控制台上完美运行,但在 ASP.NET 上生成错误

urlmon.dll FindMimeFromData() 在 64 位桌面/控制台上完美运行,但在 ASP.NET 上生成错误