2011-02-19 18 views

答えて

5

アップデート:下記のyeonshのメモのとおり、iOS 5.0からはより良い方法があります。この回答は、iOS < 5.0に関連しています。

フォーム

資産ライブラリに、あなたがALAssetからURLを抽出することができますが、すべてのファイル名が同じである://asset/asset.JPG ID =十億一& EXT = JPG

を?何らかの理由であなたが別のファイル名が必要な場合は

、内外のパラダイムを作ってみてください:あなたはALAssetの内容を読み取るために、ファイル名を必要としない

#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.defaultRepresentation.getBytesメソッドを使用します。

+0

@トーマス:電子メールに添付ファイルとして複数の画像を追加するには、ファイル名が必要です。これらのファイル名はALAssetsを介してどのようにアクセスされますか?ありがとう – jarryd

+0

MFMailComposeViewController.addAttachmentDataメソッドには、ALAssetのNSDataが必要です。次に、 'any'ファイル名とmimeTypeが必要です。したがって、上記のtoExternalFormメソッドを変更してファイル名(例: '1000000001.JPG')を返し、ファイル拡張子をmimeType、 '.JPG'から - > image/jpegにマップするメソッドを作成します。 – ThomasRS

+0

@トーマス:これはどのように使うべきですか?私は現在のクラスでtoExternalFormメソッドを使うことができますか、@implementation NSURLは何ですか?私が現在のクラス(メソッドだけ)で使うことができれば、self.schemeとは何ですか?どうもありがとう。 – jarryd

33

iOS 5.0から、ALAssetRepresentationクラスからファイルを取得できます。

ALAssetRepresentation *rep = [anAssetItem defaultRepresentation]; 
NSString *fileName = [rep filename]; 
関連する問題