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.


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)

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];

2

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

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

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}


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.