2009-10-03 19 views
73

Tengo un objeto NSURL que me da la ruta de un archivo local (en la carpeta de documentos). Quiero llenar un objeto NSData con el contenido de este archivo. Intentó usar dataWithContentsOfURL: pero esto falla. Sé que el archivo existe porque el iPhone SDK devuelve la ruta.iPhone - NSData de la URL del archivo local

¿Puede alguien decirme cómo puedo obtener un objeto NSData del URL de un archivo local?

Gracias.

+0

¿Qué significa "pero falla"? – Marco

+0

¡Significa que se congela en este punto! Da una excepción. Estoy intentando acceder a los datos de un video, cuya URL obtenemos de UIImagePickerController – lostInTransit

+0

Parece que estás tratando de pasar un objeto que no es un NURL. ¿Cómo está obteniendo la URL del archivo? ¿Está seguro de que es una URL y no un NSString? – Marco

Respuesta

146
// Given some file path URL: NSURL *pathURL 
// Note: [pathURL isFileURL] must return YES 
NSString *path = [pathURL path]; 
NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];
+1

contentsOfFile toma un NSString con la ruta del archivo. Obtengo un objeto NSURL. – lostInTransit

+0

No estoy seguro, pero al usar defaultManager en lugar de alloc, init puede causar problemas de subprocesos. – carlossless

+2

Los [documentos de NSFileManager] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html) tienen esto que decir bajo Threading Considerations: "The los métodos del objeto NSFileManager compartido pueden invocarse de múltiples hilos de forma segura ". La única excepción que notan es si tiene la intención de gestionar las devoluciones de llamadas de delegados desde las operaciones del administrador de archivos; No creo que eso se aplique aquí. – Tim

24

Para conseguir este trabajo sólo tiene que hacer:

NSURL *imgPath = [[NSBundle mainBundle] URLForResource:@"search" withExtension:@"png"]; 
NSString*stringPath = [imgPath absoluteString]; //this is correct 

//you can again use it in NSURL eg if you have async loading images and your mechanism 
//uses only url like mine (but sometimes i need local files to load) 
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringPath]]; 
UIImage *ready = [[[UIImage alloc] initWithData:data] autorelease]; 
1

Asegúrese de que su local URL comienza con "file: //" entonces sólo tendría que hacer esto:

NSData *fileData = [NSData dataWithContentsOfFile:fileURL.path]; 
+0

url siempre se devuelve como assets-library: //asset/asset.MOV? Id = 095AA9E9-A4F5-4035- 9A21-3CFF04F45C70 y ext = MOV @ahbou –

+0

Eso solo es válido para los Contenidos (Fotos y videos). El OP está pidiendo un archivo de la carpeta de documentos – ahbou

+0

cuando creo un objeto de datos desde la URL seleccionada desde asset_library me da nil @ahbou –

0

Para swift3 he encontrado respuesta del siguiente URL útiles

(que estaba recibiendo siguiente ruta, después de capturar la imagen usando PhoneGap Plugin

archivo: ///var/mobile/Containers/Data/Application/B64B06DE-7976-45CF-9BE2-661F0F309A06/tmp/abcded.jpg)

https://stackoverflow.com/a/41043447/6383908

si deja videoURL = URL (cadena: urlString), deja datos de vídeo = oportunidad? Datos (contentsOf: videoURL) { // Agregue el código de Alamofire aquí }

Cuestiones relacionadas