从内容而不是从扩展名中获取文件类型[重复]

Posted

技术标签:

【中文标题】从内容而不是从扩展名中获取文件类型[重复]【英文标题】:Get a file type from the contents and NOT from extension [duplicate] 【发布时间】:2011-06-08 00:12:35 【问题描述】:

可能重复:How can you read a files MIME-type in objective-c

在 Cocoa 中,我正在尝试获取文件类型,即 I.E. JPG、JPEG 或 PNG,使用

LSCopyKindStringForURL((CFURLRef)URL, (CFStringRef *)&kind);

这仅在文件扩展名有效时才有帮助。但是,如果我将 PNG 文件扩展名重命名为 JPEG,它会返回 JPEG,因为 LSCopyKindStringForURL 从扩展名返回文件类型。

还有其他方法可以从文件的基础内容中返回确切的类型吗?

【问题讨论】:

【参考方案1】:

有MagicKit.framework,它是libmagic 的包装。 (这是file 命令使用的)。在我的测试中,它确定 UTI 可能需要做一些工作,但这可能是一个好的开始。

大多数启动服务 API 等不会在内部查看文件的数据,AFAIK。也就是说,实际处理此类数据的框架(在本例中为图像数据,ImageIO.framework、NSImage 等)通常可以处理此类差异。 (例如,将 PNG 文件扩展名更改为 .gif,Preview.app 仍然会很乐意打开它。)

【讨论】:

我找到了解决方案。您需要使用 Core Graphics 框架获取文件的元数据。【参考方案2】:
CGImageSourceRef source = CGImageSourceCreateWithURL( (CFURLRef) URL, NULL);
NSDictionary* metadata = (NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source,0,NULL);

【讨论】:

别忘了释放这些对象。

以上是关于从内容而不是从扩展名中获取文件类型[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在java中确定文件的实际内容类型[重复]

获取图像类型属性​​[重复]

C#按内容类型获取文件扩展名

有啥方法可以从文件中扣除内容类型[重复]

Laravel 5 - 从文件扩展名中获取 MIME 类型

上传文件时获取不正确的文件扩展名和内容类型