iPhone - NSData à partir de l'URL du fichier local

85

J'ai un NSURLobjet qui me donne le chemin d'un fichier local (dans le dossier documents). Je souhaite remplir un NSDataobjet avec le contenu de ce fichier. J'ai essayé d'utiliser dataWithContentsOfURL:mais cela échoue. Je sais que le fichier existe car l'iPhone SDKrenvoie le chemin.

Quelqu'un peut-il me dire comment je peux obtenir un NSDataobjet à partir URLd'un fichier local?

Merci.

perdu
la source
Que signifie «mais ça échoue»?
Marco
Cela signifie qu'il gèle à ce stade! Donne une exception. Je suis en train d'accéder aux données d'une vidéo, dont l'URL nous obtenons de UIImagePickerController
lostInTransit
Il semble que vous essayez de passer un objet qui n'est pas une NURL. Comment obtenez-vous l'URL du fichier, êtes-vous sûr qu'il s'agit d'une URL et non d'une NSString?
Marco
@AliKhaki: Veuillez ne pas apporter de modifications triviales, il faut deux personnes dans la file d'attente de révision pour examiner vos modifications. Si vous modifiez une question pour l'améliorer, n'hésitez pas à supprimer des éléments inutiles comme "merci", mais ne modifiez pas la question uniquement pour cela. Merci!
Cris Luengo

Réponses:

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

Code rapide:

let data = FileManager.default.contents(atPath: path)
Tim
la source
1
contentsOfFile prend une NSString avec le chemin du fichier. Je reçois un objet NSURL.
lostInTransit
Je ne suis pas sûr mais, en utilisant defaultManager au lieu d'alloc, init peut causer des problèmes de thread.
carlossless
2
La documentation NSFileManager indique ceci sous Threading Considerations: "Les méthodes de l'objet NSFileManager partagé peuvent être appelées à partir de plusieurs threads en toute sécurité." La seule exception qu'ils notent est si vous avez l'intention de gérer les rappels délégués à partir des opérations du gestionnaire de fichiers; Je ne pense pas que cela s'applique ici.
Tim
Notez que le chemin est 'Chemin complet' du fichier, que vous pouvez trouver sous Inspecteur de fichiers de XCode
Burak
29

Pour obtenir ce travail, il vous suffit de faire:

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
la source
2

Assurez-vous que votre URL locale commence par "file: //", il vous suffira alors de faire ceci:

 NSData *fileData = [NSData dataWithContentsOfFile:fileURL.path];
ahbou
la source
L'url est toujours retournée sous la forme assets-library: //asset/asset.MOV? id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70 & ext = MOV @ahbou
Mansuu ....
Ce n'est valable que pour les actifs (photos et vidéos). L'OP demande un avis sur un fichier du dossier documents
ahbou
lorsque je crée un objet de données à partir de l'url sélectionnée pour asset_library, cela me donne aucun @ahbou
Mansuu ....
Les actifs ne sont gérés que par AssetsLibrary ou Photos.framework. Pour récupérer un élément, vous devez appeler asset.assetForURL {} Recherchez cette méthode ou posez une nouvelle question en tant que sujet distinct.
ahbou
0

Pour swift3, j'ai trouvé la réponse de l'URL suivante utile

(J'obtenais le chemin suivant, après avoir capturé l'image à l'aide du plugin phonegap

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

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

si laissez videoURL = URL (string: urlString), laissez videodata = essayez? Data (contentsOf: videoURL) {// Ajoutez le code d'Alamofire ici}

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