88 votes

IPhone - NSData de l'URL du fichier local

J'ai un objet NSURL qui me donne le chemin d'un fichier local (dans le dossier des documents). Je veux remplir un objet NSData avec le contenu de ce fichier. J'ai essayé d'utiliser dataWithContentsOfURL: mais cela échoue. Je sais que le fichier existe car l'iPhone SDK renvoie le chemin.

Est-ce que quelqu'un peut me dire comment je peux obtenir un objet NSData à partir de l'URL d'un fichier local ?

Merci.

0 votes

Qu'est-ce que ça veut dire "mais cela échoue" ?

0 votes

Cela signifie que cela se fige à ce point ! Lance une exception. J'essaie d'accéder aux données d'une vidéo, dont nous obtenons l'URL à partir de UIImagePickerController

0 votes

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 ?

168voto

Tim Points 33042
// Étant donné une URL de chemin de fichier : NSURL *pathURL
// Remarque : [pathURL isFileURL] doit renvoyer YES
NSString *path = [pathURL path];
NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];

Code Swift:

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

1 votes

ContentsOfFile prend un NSString avec le chemin du fichier. Je reçois un objet NSURL.

0 votes

Je ne suis pas sûr, mais utiliser defaultManager à la place de alloc, init pourrait causer des problèmes de threading.

2 votes

Les docs de NSFileManager disent ceci dans la section Considerations threading : "Les méthodes de l'objet NSFileManager partagé peuvent être appelées en toute sécurité à partir de plusieurs threads." La seule exception qu'ils notent est si vous avez l'intention de gérer les rappels de délégué des opérations du gestionnaire de fichiers; Je ne crois pas que cela s'applique ici.

29voto

Pour que cela fonctionne, il vous suffit de faire :

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

//vous pouvez à nouveau l'utiliser dans NSURL par exemple si vous avez le chargement asynchrone d'images et que votre mécanisme utilise uniquement des URL comme le mien (mais parfois j'ai besoin de charger des fichiers locaux)
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringPath]];
UIImage *ready = [[[UIImage alloc] initWithData:data] autorelease;

3voto

ahbou Points 2149

Assurez-vous que votre URL locale commence par "file://" ensuite vous n'aurez qu'à faire ceci :

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

0voto

Chirag Purohit Points 423

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

(Je recevais le chemin suivant, après avoir capturé une image en utilisant le plugin phonegap

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

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

if let videoURL = URL(string: urlString), let videodata = try? Data(contentsOf: videoURL) { //Ajouter le code d'Alamofire ici }

0voto

Anton Tropashko Points 2235
guard let data = FileManager.default.contents(atPath: path) else
    { ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X