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.

perdido en el transito
fuente
¿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)
Tim
fuente
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];
Marcin Małysz
fuente
2

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

 NSData *fileData = [NSData dataWithContentsOfFile:fileURL.path];
ahbou
fuente
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í}

Chirag Purohit
fuente
0
guard let data = FileManager.default.contents(atPath: path) else
    { ...
Anton Tropashko
fuente