Как извлечь имя файла из ALAsset?Получение имени файла для ALAsset
Есть ли способ получить это через URL-адрес или каким-либо другим способом?
Как извлечь имя файла из ALAsset?Получение имени файла для ALAsset
Есть ли способ получить это через URL-адрес или каким-либо другим способом?
Обновление: В качестве примечаний, приведенных ниже, от iOS 5.0 существует лучший способ. Этот ответ важен для iOS < 5.0.
Вы можете извлечь URL из ALAsset, но все имена файлов совпадают, на форме
активы библиотека: //asset/asset.JPG ID = 1000000001 & внутр = 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.
Из iOS 5.0 вы можете получить файл из класса ALAssetRepresentation.
ALAssetRepresentation *rep = [anAssetItem defaultRepresentation];
NSString *fileName = [rep filename];
@Thomas: Мне нужны имена файлов для добавления нескольких изображений в электронное письмо как вложения. Как получить доступ к этим файлам через ALAssets? спасибо – jarryd
Ну, для метода MFMailComposeViewController.addAttachmentData нужны NSData для ALAsset, а затем «any» filename и mimeType. Поэтому я бы изменил метод toExternalForm выше, чтобы просто вернуть имя файла, например, «1000000001.JPG», и создать метод, который отображает с расширением имени файла на mimeType, «.JPG» на -> изображение/jpeg. – ThomasRS
@Thomas: Как это использовать? Могу ли я просто использовать метод toExternalForm в моем текущем классе или что такое @implementation NSURL? Если я могу использовать его в моем текущем классе (просто метод), что такое self.scheme? Большое спасибо. – jarryd