2011-02-19 6 views
8
için bir dosya adı alma

Dosya adı ALAsset'ten nasıl çıkarılabilir?ALAsset

Bunu URL yoluyla veya başka bir yolla elde etmenin bir yolu var mı?

cevap

5

Güncelleştirmesi: Yeonsh aşağıdaki notlarda, iOS 5.0'dan daha iyi bir yol var. Bu cevap iOS < 5.0 ile ilgilidir.

Sen ALAsset bir URL çıkarabilir, ancak tüm dosya formda,

varlıklar-kütüphane aynıdır:? //asset/asset.JPG id = 1000000001 & ext = JPG

nedense farklı dosya adları gerekiyorsa

, bir iç-dış paradigma yapmayı deneyin: bir ALAsset içeriğini okumak için bir dosya adı gerekmez

#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 

not. Bunun için ALAsset.defaultRepresentation.getBytes yöntemini kullanın.

+0

@Thomas: E-postaya ek olarak birden fazla resim eklemek için dosya adlarına ihtiyacım var. Bu dosya adlarına ALAssets aracılığıyla nasıl erişilir? teşekkürler – jarryd

+0

MFMailComposeViewController.addAttachmentData yönteminin ALAsset'in NSData'sına ve sonra 'herhangi bir' dosya adına ve mimeType'a ihtiyacı vardır. Bu yüzden, sadece '1000000001.JPG' dosya adını döndürmek için yukarıdakiExExForm yöntemini değiştiririm ve dosya adı uzantısından mimeType, '.JPG' -> image/jpeg'ye eşlenen bir yöntem oluşturur. – ThomasRS

+0

@Thomas: Bu nasıl kullanılmalı? Geçerli sınıfımda sadece toExternalForm yöntemini kullanabilir miyim, yoksa @IMplementation NSURL nedir? Eğer mevcut sınıfımda kullanabiliyorsam (sadece yöntem), self.scheme nedir? Çok teşekkürler. – jarryd

33

iOS 5.0'dan dosyayı ALAssetRepresentation Class'tan alabilirsiniz.

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