iPhone: NSData de la URL del archivo local


85

Tengo un NSURLobjeto que me da la ruta de un archivo local (en la carpeta de documentos). Quiero rellenar un NSDataobjeto con el contenido de este archivo. Intenté usar dataWithContentsOfURL:pero esto falla. Sé que el archivo existe porque el iPhone SDKdevuelve la ruta.

¿Alguien puede decirme cómo puedo obtener un NSDataobjeto URLde un archivo local?

Gracias.


¿Qué significa "pero falla"?
Marco

¡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

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

@AliKhaki: No hagas ediciones triviales, se necesitan dos personas en la cola de revisión para revisar tus cambios. Si edita una pregunta para mejorarla, no dude en eliminar cosas inútiles como "gracias", pero no edite la pregunta solo por eso. ¡Gracias!
Cris Luengo

Respuestas:


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

Código SWIFT:

let data = FileManager.default.contents(atPath: path)

1
contentOfFile toma un NSString con la ruta del archivo. Obtengo un objeto NSURL.
lostInTransit

No estoy seguro, pero al usar defaultManager en lugar de alloc, init podría causar problemas de subprocesos.
Carlossless

2
Los documentos de NSFileManager tienen esto que decir en Consideraciones de subprocesos: "Los métodos del objeto NSFileManager compartido se pueden llamar desde varios subprocesos de forma segura". La única excepción que notan es si tiene la intención de manejar devoluciones de llamada delegadas de las operaciones del administrador de archivos; No creo que eso se aplique aquí.
Tim

Tenga en cuenta que la ruta es 'Ruta completa' del archivo, que puede encontrar en el Inspector de archivos de XCode
Burak

29

Para conseguir este trabajo, solo necesita 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];

2

Asegúrese de que su URL local comience con "file: //", entonces solo tendría que hacer esto:

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

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

Eso solo es válido para Activos (fotos y videos). El OP está preguntando sobre un archivo de la carpeta de documentos
ahbou

cuando creo un objeto de datos desde la URL seleccionada para asset_library, me da nulo @ahbou
Mansuu ...

Los activos solo son manejados por AssetsLibrary o Photos.framework. Para recuperar un activo, debe llamar a asset.assetForURL {} Busque este método o haga una nueva pregunta, ya que este es un tema aparte.
ahbou

0

Para swift3 encontré útil la respuesta de la siguiente URL

(Estaba siguiendo la ruta, después de capturar la imagen usando el complemento phonegap

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

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

si deja videoURL = URL (string: urlString), deje videodata = probar? Data (contentsOf: videoURL) {// Agrega el código de Alamofire aquí}


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.