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

时间:2011-01-28 21:14:18

标签: c# .net mime mime-types

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

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

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

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

2 个答案:

答案 0 :(得分:5)

阅读FindMimeFromData的文档,将我引导至MIME Type Detection in Internet Explorer。根据这些信息,它很难找到26 different MIME types,这在今天的世界里很小。 “audio / mp3”不是其中之一。

  

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

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

答案 1 :(得分:3)

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

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