【问题标题】:Retrieving a filename for an ALAsset检索 ALAsset 的文件名
【发布时间】:2011-06-30 05:41:12
【问题描述】:

如何从 ALAsset 中提取文件名?

有没有办法通过 url 或其他方式获取?

【问题讨论】:

    标签: iphone


    【解决方案1】:

    更新:正如下面 yeonsh 所说,从 iOS 5.0 开始有更好的方法。此答案适用于 iOS

    您可以从 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 访问这些文件名?谢谢
    • 嗯,MFMailComposeViewController.addAttachmentData 方法需要 ALAsset 的 NSData,然后是“任何”文件名和 mimeType。所以我会修改上面的 toExternalForm 方法只返回文件名,例如'1000000001.JPG',并制作一个从文件扩展名映射到mimeType,'.JPG'到-> image/jpeg的方法。
    • @Thomas:这个应该怎么用?我可以只在我当前的类中使用 toExternalForm 方法吗?或者@implementation NSURL 有什么用?如果我可以在我当前的课程中使用它(只是方法),self.scheme 是什么?非常感谢。
    • 没有真正的魔术,将方法复制到您想要的任何类。 @implementation NSURL 仅用于为那些想要导入该标头/将这些方法添加到 NSURL 的代码片段扩展 NSURL 类,类似于 NSURL 的“实用程序”扩展。是的,所以这是一种干净的方法,通过正确的设置,即导入,您可以使用上述方法调用 NSURL:P
    • @Thomas:感谢您的所有帮助,我有一个问题,即导入时 URLParser 不存在(两个导入都不存在)。我应该添加一个框架吗?也不存在“EXTERNAL_TOKEN”。
    【解决方案2】:

    从 iOS 5.0 开始,您可以从 ALAssetRepresentation 类中获取文件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 2011-06-27
      • 2011-04-19
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多