IOS UTI统一类型标识符:判断文件类型通过后缀

今天在学习文档和数据共享中,首先讲的处理统一类型标识符UTI。第一次见,所以记下来以备之用,首先了解UTI和MIME的概念

1.同一类型标识符(Uniform Type Identifier,UTI)代表IOS信息共享的中心组件。可以把它看成下一代的MIME类型。UTI是标识资源类型(比如图像和文本)的字符串,他们制定哪些类型的信息将用于公共数据对象,他们不需要依赖于老式的指示符,比如文件扩展名,MIME类型,或者文件类型的元数据

如图,显示了Apple的基本顺应树的一部分。这个树上位于较低位置的任何项目都必须顺应其所有父数据属性。声明一个父UTI意味着支持他的所有子UTI。因此,可以打开public.data的应用必须能打开文本,电影,图像文件等。其UTI的名称类型就是public.data等

2.MIME的了解可以去百度百科上有定义:http://baike.baidu.com/link?url=TQx8NxQPb8m5bsMWVR6p7NIFemdxyPh6RH_uG01FTKNIg7-iy4-TLiUXVIOxj-BavNOWugJCixMEywo7vJrdPq

MIME的定义类型如下 如text/xml就是后缀.xml的MIME类型。

常见的MIME类型(通用型):

超文本标记语言文本 .html text/html

xml文档 .xml text/xml

3.常见的文件扩展名之间的相互转换

首先要添加MobileCoreServices.framework框架,并且在头文件中添加

#import <MobileCoreServices/MobileCoreServices.h>

以下都用的是C语言编写的

(1)后缀名字符串转化为UTI字符串

-(NSString *)preferredUTIForExtention:(NSString *)ext
{
    //Request the UTI via the file extension
    NSString *theUTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)(ext), NULL);
    return theUTI;
}

(2)使用kUITagClassMIMEType作为第一个参数,给UITypeCreatePreferredIdentifierForTag(),是MIME类型字符串转化为UTI字符串

NSString *preferredUTIForMIMEType(NSString *mime)
{
    //request the UTI via the file extention
    NSString *theUTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType,(__bridge CFStringRef)mime, NULL);
    return theUTI;
}

(3)使用UITypeCopyPreferredTagWithClass(),是UTI字符串转化为后缀扩展名

NSString *extensionForUTI(NSString *aUTI)
{
    CFStringRef theUTI = (__bridge CFStringRef)aUTI;
    CFStringRef results = UTTypeCopyPreferredTagWithClass(theUTI, kUTTagClassFilenameExtension);
    return (__bridge_transfer NSString *)results;
}

(4)UTI字符串转化为MIME类型

NSString *mimeTypeForUTI(NSString *aUTI)
{
    CFStringRef theUTI = (__bridge CFStringRef) aUTI;
    CFStringRef results = UTTypeCopyPreferredTagWithClass(theUTI, kUTTagClassMIMEType);
    return (__bridge_transfer NSString *)results;
}

(5)测试顺应性,使用UITypeConformsTo()函数测试顺应性。该函数接受两个参数:一个源UTI和一个要比较的UTI,如果第一个UTI顺应第二个UTI,就返回True。相等性测试则使用UITypeEqual(),下面显示了一个示例,说明如何顺应性测试,确定文件路径是否可能指向图像资源。

BOOL pathPointsToLikelyUTIMatch(NSString *path, CFStringRef theUTI)
{
    NSString *extension = path.pathExtension;
    NSString *preferredUTI = preferredUTIForExtension(extension);
    return (UTTypeConformsTo((__bridge CFStringRef) preferredUTI, theUTI));
}

BOOL pathPointsToLikelyImage(NSString *path)
{
    return pathPointsToLikelyUTIMatch(path, CFSTR("public.image"));
}

BOOL pathPointsToLikelyAudio(NSString *path)
{
    return pathPointsToLikelyUTIMatch(path, CFSTR("public.audio"));
}

(6)获取顺应性列表

UTTypeCopyDeclaration()是IOS API中的所有UTI函数中最一般(并且最有用)的函数,它返回包含以下键的字典。

》kUTTypeIdentifierKey:UTI名称,他将被传递给函数(例如.public.mpeg)

》kUTTypeConformsToKey:类型顺应的任何父项目(例如 public.mpeg顺应public.movie)

》kUTTypeDescriptionKey:正在考虑的类型(如果存在的话)的现实描述 (例如 “MPEG movie”)

》kUTTypeTagSpecificationKey:给定UTI的等价OSType(例如MPG和MPEG)、文件扩展名( mpg、mpeg、mpe、m75和m15)和MIME类型(视频/mpeg、视频/mpg、视频/x-mpeg和视频/x-mpg)的字典。

下面例子主要是返回字典向上通过顺应性树来构建一个数组,表示给定UTI顺序的所有项目.例如public.mpeg类型顺应public.movie public.audiovisual-content public.data public.item 和public.content,代码如下:

NSDictionary *utiDictionary(NSString *aUTI)
{
    NSDictionary *dictionary = (__bridge_transfer NSDictionary *)UTTypeCopyDeclaration((__bridge CFStringRef) aUTI);
    return dictionary;
}

NSArray *uniqueArray(NSArray *anArray)
{
    NSMutableArray *copiedArray = [NSMutableArray arrayWithArray:anArray];
    for (id object in anArray)
    {
        [copiedArray removeObjectIdenticalTo:object];
        [copiedArray addObject:object];
    }

    return copiedArray;
}

NSArray *conformanceArray(NSString *aUTI)
{
    NSMutableArray *results = [NSMutableArray arrayWithObject:aUTI];
    NSDictionary *dictionary = utiDictionary(aUTI);
    id conforms = dictionary[(__bridge NSString *)kUTTypeConformsToKey];

    // No conformance
    if (!conforms) return results;

    // Single conformance
    if ([conforms isKindOfClass:[NSString class]])
    {
        [results addObjectsFromArray:conformanceArray(conforms)];
        return uniqueArray(results);
    }

    // Iterate through multiple conformance
    if ([conforms isKindOfClass:[NSArray class]])
    {
        for (NSString *eachUTI in (NSArray *) conforms)
            [results addObjectsFromArray:conformanceArray(eachUTI)];
        return uniqueArray(results);
    }

    // Just return the one-item array
    return results;
}

NSArray *allExtensions(NSString *aUTI)
{
    NSMutableArray *results = [NSMutableArray array];
    NSArray *conformance = conformanceArray(aUTI);
    for (NSString *eachUTI in conformance)
    {
        NSDictionary *dictionary = utiDictionary(eachUTI);
        NSDictionary *extensions = dictionary[(__bridge NSString *)kUTTypeTagSpecificationKey];
        id fileTypes = extensions[(__bridge NSString *)kUTTagClassFilenameExtension];

        if ([fileTypes isKindOfClass:[NSArray class]])
            [results addObjectsFromArray:(NSArray *) fileTypes];
        else if ([fileTypes isKindOfClass:[NSString class]])
            [results addObject:(NSString *) fileTypes];
    }

    return uniqueArray(results);
}

NSArray *allMIMETypes(NSString *aUTI)
{
    NSMutableArray *results = [NSMutableArray array];
    NSArray *conformance = conformanceArray(aUTI);
    for (NSString *eachUTI in conformance)
    {
        NSDictionary *dictionary = utiDictionary(eachUTI);
        NSDictionary *extensions = dictionary[(__bridge NSString *)kUTTypeTagSpecificationKey];
        id fileTypes = extensions[(__bridge NSString *)kUTTagClassMIMEType];

        if ([fileTypes isKindOfClass:[NSArray class]])
            [results addObjectsFromArray:(NSArray *) fileTypes];
        else if ([fileTypes isKindOfClass:[NSString class]])
            [results addObject:(NSString *) fileTypes];
    }

    return uniqueArray(results);
}
时间: 2024-07-30 23:53:56

IOS UTI统一类型标识符:判断文件类型通过后缀的相关文章

iOS UTI(统一类型标识)

同一类型标识符(Uniform Type Identifier,UTI)代表IOS信息共享的中心组件.可以把它看成下一代的MIME类型.UTI是标识资源类型(比如图像和文本)的字符串,他们制定哪些类型的信息将用于公共数据对象,他们不需要依赖于老式的指示符,比如文件扩展名,MIME类型,或者文件类型的元数据 如图,显示了Apple的基本顺应树的一部分.这个树上位于较低位置的任何项目都必须顺应其所有父数据属性.声明一个父UTI意味着支持他的所有子 UTI.因此,可以打开public.data的应用必

IOS判断文件类型

IOS判断文件类型 2013-11-06 13:14 929人阅读 评论(0) 收藏 举报 最近在做的东西有下载zip,只是服务器发送过来的是二进制,需要根据二进制来判断是什么类型的文件,从而进行保存操作.起初很不理解,到后来发现可以通过二进制的前2位的ascii码来进行判断.如下: // 255216 jpg;        // 7173 gif;        // 6677 bmp,        // 13780 png;        // 6787 swf        // 77

UNIX环境编程学习笔记(6)——文件I/O之判断文件类型

lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: (1) 普通文件(regular file) 这种文件包含了某种形式的数据,这些数据无论是文件还是二进制对于 UNIX 内核而言都是一样的.对普通文件内容的解释有处理该文件的应用程序进行. (2) 目录文件(directory file) 目录文件包含了其他文件的名字以及指向与这些文件有关信息的指

Linux下如何判断文件类型

在Linux下总共有7种文件类型,分别为: 普通文件(-) 目录文件(d), 软链接文件(l)=快捷方式, 块设备文件,二进制文件(b)   字符设备文件(c) 套接字文件(s) 管道文件(p) 其中常用的文件类型为:普通文件,目录文件和软链接文件 系统特殊文件类型为:块设备文件,字符设备文件,套接字文件,管道文件. 如何判断文件类型? 在当前目录下使用命令: ls -l,即可列出该目录下的所有文件,其第一列的第一个字母就包含了该文件的文件类型: 其第一列的长度为10位,除去第一位用于表示文件类

c#真正判断文件类型

//真正判断文件类型的关键函数 public static bool IsAllowedExtension2(FileUpload hifile) { if (hifile != null) { System.IO.FileStream fs = new System.IO.FileStream(hifile.PostedFile.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.IO.BinaryRead

JavaScript根据文件名判断文件类型

//JavaScript根据文件名判断文件类型 var imgExt = new Array(".png",".jpg",".jpeg",".bmp",".gif");//图片文件的后缀名 var docExt = new Array(".doc",".docx");//word文件的后缀名 var xlsExt = new Array(".xls"

利用PHP取二进制文件头判断文件类型

<?php $files = array('D:\no.jpg', 'D:\no.png','D:\no2.JPEG','D:\no.BMP'); $fileTypes = array( 7790 => 'exe', 7784 => 'midi', 8297 => 'rar', 255216 => 'jpg', 7173 => 'gif', 6677 => 'bmp', 13780 => 'png' ); foreach($files as $file) {

利用文件头判断文件类型

上传文件时经常需要做文件类型判断,例如图片.文档等,普通做法是直接判断文件后缀名,而文艺青年为了防止各种攻击同时也会加上使用文件头信息判断文件类型. 原理很简单:用文件头判断,直接读取文件的前2个字节即可. 1 public class FileUtil { 2 /** 3 * byte数组转换成16进制字符串 4 * 5 * @param src 6 * @return 7 */ 8 private static String bytesToHexString(byte[] src) { 9

shell判断文件类型和权限

shell  判断文件类型. -d 文件 判断该文件是否存在,并且是否为目录(是目录为真) -e文件 判断该文件是否存在(存在为真) -f文件 判断该文件是否存在,并且是否为文件(是普通文件为真) -r 如果有文件存在 ,判断文件是否具有读权限有读权限返回真-w如果有文件存在 ,判断文件是否具有写权限有写权限返回真-x如果有文件存在 ,判断文件是否具有执行权限有执行权限返回真 在shell中的写法一般是 eg:[空格-e 文件路径 空格] [ -e /tmp/index.php ] [ -e /