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

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

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

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

问题与此类似,但由于返回的MIME类型不同/不明确,所提供的解决方案不适合validation上传的文件。

阅读FindMimeFromData的文档会引导我进入Internet Explorer中的MIME类型检测 。 根据该信息,硬编码可以找到26种不同的MIME类型 ,这在当今世界中非常小。 “audio / mp3”不是其中之一。

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

不幸的是,看起来FindMimeFromData对于确定现代MIME类型不是很有用。

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

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