¿Cómo se puede extraer el nombre de archivo de un ALAsset?Recuperar un nombre de archivo para un ALAsset
¿Hay alguna manera de obtener esto a través de la url o de alguna otra manera?
¿Cómo se puede extraer el nombre de archivo de un ALAsset?Recuperar un nombre de archivo para un ALAsset
¿Hay alguna manera de obtener esto a través de la url o de alguna otra manera?
Actualización: Como notas de yeonsh a continuación, desde iOS 5.0 hay una mejor manera. Esta respuesta es relevante para iOS < 5.0.
se puede extraer una URL desde el ALAsset, pero todos los nombres de los archivos son los mismos, en la forma
activos de la biblioteca:? Id = 1000000001 //asset/asset.JPG & ext = JPG
Si por alguna razón necesita diferentes nombres de archivo, trate de hacer un paradigma interno-externo:
#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
Tenga en cuenta que no es necesario un nombre de archivo para leer el contenido de un ALAsset. Utilice el método ALAsset.defaultRepresentation.getBytes para eso.
Desde iOS 5.0 puede obtener el archivo de ALAssetRepresentation Class.
ALAssetRepresentation *rep = [anAssetItem defaultRepresentation];
NSString *fileName = [rep filename];
@Thomas: Necesito los nombres de los archivos para agregar varias imágenes a un correo electrónico como archivos adjuntos. ¿Cómo se accederá a estos nombres de archivo a través de los ALAssets? gracias – jarryd
Bueno, el método MFMailComposeViewController.addAttachmentData necesita el NSData del ALAsset, y luego 'any' filename y el mimeType. Así que modificaría el método toExternalForm anterior para simplemente devolver el nombre de archivo, por ejemplo, '1000000001.JPG ', y crear un método que se correlacione desde la extensión de nombre de archivo a mimeType,' .JPG 'a -> image/jpeg. – ThomasRS
@Thomas: ¿Cómo se debe usar esto? ¿Puedo usar el método toExternalForm en mi clase actual o para qué sirve @implementation NSURL? Si puedo usarlo en mi clase actual (solo el método), ¿qué es self.scheme? Muchas gracias. – jarryd