检索ALAsset的文件名

8

如何从ALAsset中提取文件名?

是否可以通过URL或其他方式获取它?

2个回答

33

iOS 5.0起,您可以通过ALAssetRepresentation类获取文件。

ALAssetRepresentation *rep = [anAssetItem defaultRepresentation];
NSString *fileName = [rep filename];

5

更新: 如下面yeonsh所指出的,从iOS 5.0开始有更好的方法。这个答案适用于iOS < 5.0。

你可以从ALAsset中提取URL,但所有文件名都相同,格式为:

assets-library://asset/asset.JPG?id=1000000001&ext=JPG

如果出于某种原因需要不同的文件名,请尝试制作内部-外部模式:

#import <Foundation/Foundation.h>

@interface NSURL (NSURL_Asset)

- (NSURL*) toExternalForm;
- (NSURL*) fromExternalForm;
- (NSString*) toExternalFilename;    

@end

#import "NSURL+Asset.h"
#import "URLParser.h" // from http://iphone.demay-fr.net/2010/04/parsing-url-parameters-in-a-nsstring/

static NSString *const EXTERNAL_TOKEN = @"/assetExternalForm/";

@implementation NSURL (NSURL_Asset)

// assets-library://asset/asset.JPG/assetExternalForm/1000000001.JPG -> assets-library://asset/asset.JPG?id=1000000001&ext=JPG
- (NSURL*) fromExternalForm {
    if([self.scheme isEqualToString:@"assets-library"]) {
        NSRange slash = [self.absoluteString rangeOfString:EXTERNAL_TOKEN options:NSBackwardsSearch];
        if(slash.location != NSNotFound) {

            NSRange dot = [self.absoluteString rangeOfString:@"." options:NSBackwardsSearch];

            if(dot.location != NSNotFound) {
                NSString* extention = [self.absoluteString substringFromIndex:(dot.location + dot.length)];
                NSString* identifier = [self.absoluteString substringWithRange:NSMakeRange(slash.location + slash.length, dot.location - (slash.location + slash.length))];

                return [NSURL URLWithString:[NSString stringWithFormat:@"%@?id=%@&ext=%@", [self.absoluteString substringToIndex:slash.location], identifier, extention]];
            }
        }
    }
    return self;
}

// assets-library://asset/asset.JPG?id=1000000001&ext=JPG -> assets-library://asset/asset.JPG/assetExternalForm/1000000001.JPG
- (NSURL*) toExternalForm {
    if([self.scheme isEqualToString:@"assets-library"]) {
        NSRange range = [self.absoluteString rangeOfString:@"?"];
        if(range.location != NSNotFound) {
            URLParser *parser = [[[URLParser alloc] initWithURLString:self.absoluteString] autorelease];

            NSString* extention = [parser valueForVariable:@"ext"];
            NSString* identifier = [parser valueForVariable:@"id"];

            if(extention != NULL && identifier != NULL) {
                return [NSURL URLWithString:[NSString stringWithFormat:@"%@%@%@.%@", [self.absoluteString substringToIndex:range.location], EXTERNAL_TOKEN, identifier, extention]];
            }
        }
    }
    return self;
}

// assets-library://asset/asset.JPG?id=1000000001&ext=JPG -> 1000000001.JPG
- (NSString*) toExternalFilename {
    if([self.scheme isEqualToString:@"assets-library"]) {
        NSRange range = [self.absoluteString rangeOfString:@"?"];
        if(range.location != NSNotFound) {
            URLParser *parser = [[[URLParser alloc] initWithURLString:self.absoluteString] autorelease];

            NSString* extention = [parser valueForVariable:@"ext"];
            NSString* identifier = [parser valueForVariable:@"id"];

            if(extention != NULL && identifier != NULL) {
                return [NSString stringWithFormat:@"%@.%@", identifier, extention];
            }
        }
    }
    return NULL;
}

@end

请注意,您不需要文件名来读取ALAsset的内容。使用ALAsset.defaultRepresentation.getBytes方法即可实现此操作。

@Thomas:我需要添加多张图片作为附件到电子邮件中,需要这些文件名。如何通过ALAssets访问这些文件名?谢谢。 - some_id
好的,MFMailComposeViewController.addAttachmentData方法需要ALAsset的NSData,然后是“任何”文件名和mimeType。因此,我将修改上面的toExternalForm方法以仅返回文件名,例如'1000000001.JPG',并创建一个从文件名扩展名映射到mimeType的方法,'.JPG'到-> image / jpeg。 - ThomasRS
没有什么真正的魔法技巧,只需将该方法复制到您想要的任何类中即可。@implementation NSURL 仅用于扩展 NSURL 类,以供那些希望导入该头文件/添加这些方法到 NSURL 的代码片段使用,是 NSURL 的“实用”扩展。是的,所以这是一种干净的方法,通过正确的设置,即导入,您可以在上述方法中调用 NSURL :P - ThomasRS
我的错。谢谢。那么这个用在什么地方?如果我想要获取文件名怎么办?是什么调用了这个函数?抱歉问了这么多问题,我只是不确定如何使用它,而且似乎没有其他人知道。 - some_id
修改NSURL URLWithString方法以更改返回的内容。 - ThomasRS
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接