iPhone - NSData von der URL der lokalen Datei

85

Ich habe ein NSURLObjekt, das mir den Pfad einer lokalen Datei (im Dokumentenordner) gibt. Ich möchte ein NSDataObjekt mit dem Inhalt dieser Datei füllen. Versucht mit, dataWithContentsOfURL:aber dies schlägt fehl. Ich weiß, dass die Datei existiert, weil das iPhone SDKden Pfad zurückgibt.

Kann mir bitte jemand sagen, wie ich ein NSDataObjekt aus URLeiner lokalen Datei erhalten kann?

Vielen Dank.

lostInTransit
quelle
Was bedeutet "aber es scheitert"?
Marco
Bedeutet, dass es an dieser Stelle einfriert! Gibt eine Ausnahme. Ich versuche, auf die Daten eines Videos zuzugreifen, deren URL wir von UIImagePickerController erhalten
lostInTransit
Anscheinend versuchen Sie, ein Objekt zu übergeben, das keine NURL ist. Wie erhalten Sie die Datei-URL? Sind Sie sicher, dass es sich um eine URL und nicht um einen NSString handelt?
Marco
@AliKhaki: Bitte nehmen Sie keine trivialen Änderungen vor. Es sind zwei Personen in der Überprüfungswarteschlange erforderlich, um Ihre Änderungen zu überprüfen. Wenn Sie eine Frage bearbeiten, um sie zu verbessern, können Sie nutzlose Dinge wie "Danke" entfernen, aber bearbeiten Sie die Frage nicht nur dafür. Vielen Dank!
Cris Luengo

Antworten:

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

SWIFT-Code:

let data = FileManager.default.contents(atPath: path)
Tim
quelle
1
contentOfFile verwendet einen NSString mit dem Dateipfad. Ich erhalte ein NSURL-Objekt.
lostInTransit
Ich bin mir nicht sicher, aber wenn Sie defaultManager anstelle von alloc verwenden, kann init Threading-Probleme verursachen.
Carlossless
2
In den NSFileManager-Dokumenten heißt es unter Überlegungen zum Threading: "Die Methoden des gemeinsam genutzten NSFileManager-Objekts können sicher von mehreren Threads aus aufgerufen werden." Die einzige Ausnahme, die sie bemerken, ist, wenn Sie delegierte Rückrufe aus den Vorgängen des Dateimanagers verarbeiten möchten. Ich glaube nicht, dass das hier gilt.
Tim
Beachten Sie, dass der Pfad 'Vollständiger Pfad' der Datei ist, den Sie unter File Inspector von XCode
Burak
29

Um diese Arbeit zu bekommen, müssen Sie nur Folgendes tun:

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
quelle
2

Stellen Sie sicher, dass Ihre lokale URL mit "file: //" beginnt. Dann müssten Sie nur Folgendes tun:

 NSData *fileData = [NSData dataWithContentsOfFile:fileURL.path];
Ahbou
quelle
URL wird immer als Assets-Bibliothek zurückgegeben: //asset/asset.MOV? id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70 & ext = MOV @ahbou
Mansuu ....
Dies gilt nur für Assets (Fotos und Videos). Das OP fragt nach einer Datei aus dem Dokumentenordner
ahbou
Wenn ich ein Datenobjekt aus einer ausgewählten URL für eine Asset-Bibliothek erstelle, erhalte ich keine @ahbou
Mansuu ....
Assets werden nur von der AssetsLibrary oder dem Photos.framework verarbeitet. Um ein Asset abzurufen, müssen Sie asset.assetForURL {} aufrufen. Suchen Sie nach dieser Methode oder stellen Sie eine neue Frage, da dies ein separates Thema ist.
Ahbou
0

Für swift3 fand ich die Antwort von der folgenden URL hilfreich

(Ich habe den folgenden Pfad gefunden, nachdem ich das Bild mit dem Phonegap-Plugin aufgenommen hatte

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

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

Wenn videoURL = URL (Zeichenfolge: urlString), lassen Sie videodata = versuchen? Daten (Inhalt von: videoURL) {// Code von Alamofire hier hinzufügen}

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