2009-10-03 7 views
73

J'ai un objet NSURL qui me donne le chemin d'un fichier local (dans le dossier de documents). Je veux remplir un objet NSData avec le contenu de ce fichier. Essayé en utilisant dataWithContentsOfURL: mais cela échoue. Je sais que le fichier existe parce que l'iPhone SDK renvoie le chemin.iPhone - NSData à partir de l'URL du fichier local

Quelqu'un peut-il me dire comment je peux obtenir un objet NSData à partir du URL d'un fichier local?

Merci.

+0

Que signifie "mais ça échoue"? – Marco

+0

Signifie qu'il gèle à ce stade! Donne une exception. J'essaie d'accéder aux données d'une vidéo, dont l'URL provient de UIImagePickerController – lostInTransit

+0

Apparemment, vous essayez de transmettre un objet qui n'est pas un NURL. Comment obtenez-vous l'URL du fichier, êtes-vous sûr que c'est une URL et non un NSString? – Marco

Répondre

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 prend un NSString avec le chemin du fichier. Je reçois un objet NSURL. – lostInTransit

+0

Je ne suis pas sûr mais, en utilisant defaultManager au lieu de alloc, init peut causer des problèmes de threading. – carlossless

+2

Les [documents NSFileManager] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html) ont ceci à dire sous Considérations de thread: 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 de délégué à partir des opérations du gestionnaire de fichiers; Je ne crois pas que cela s'applique ici. – Tim

24

Pour obtenir ce travail que vous avez juste besoin 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]; 
1

Assurez-vous que votre URL locale commence par "file: //" alors vous avez juste à faire ceci:

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

url est toujours retourné comme assets-library: //asset/asset.MOV? Id = 095AA9E9-A4F5-4035- 9A21-3CFF04F45C70 & ext = MOV @ahbou –

+0

Ceci n'est valable que pour les actifs (Photos et vidéos). L'OP est askign sur un fichier du dossier de documents – ahbou

+0

lorsque je crée un objet de données à partir de l'URL sélectionnée pour asset_library il me donne nil @ahbou –

0

Pour swift3 j'ai trouvé réponse d'URL utile

(je recevais chemin suivant, après capture d'image en utilisant le 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 = essayer? Data (contentsOf: videoURL) { // Ajouter le code d'Alamofire ici }

Questions connexes