iPhone: NSData dall'URL del file locale


85

Ho un NSURLoggetto che mi dà il percorso di un file locale (nella cartella dei documenti). Voglio popolare un NSDataoggetto con il contenuto di questo file. Ho provato a usare dataWithContentsOfURL:ma non riesce. So che il file esiste perché l'iPhone SDKrestituisce il percorso.

Qualcuno può dirmi come posso ottenere un NSDataoggetto da URLun file locale?

Grazie.


Cosa significa "ma fallisce"?
Marco

Significa che a questo punto si blocca! Fornisce un'eccezione. Sto cercando di accedere ai dati di un video, il cui URL otteniamo da UIImagePickerController
lostInTransit

Sembra che tu stia cercando di passare un oggetto che non è un NURL. Come stai ottenendo l'URL del file, sei sicuro che sia un URL e non un NSString?
Marco

@AliKhaki: Per favore, non apportare modifiche banali, sono necessarie due persone in coda di revisione per esaminare le modifiche. Se modifichi una domanda per migliorarla, sentiti libero di rimuovere cose inutili come "grazie", ma non modificare la domanda solo per questo. Grazie!
Cris Luengo

Risposte:


163

Codice SWIFT:

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

1
contentOfFile accetta un NSString con il percorso del file. Ricevo un oggetto NSURL.
lostInTransit

Non ne sono sicuro ma, usando defaultManager invece di alloc, init potrebbe causare problemi di threading.
carlossless

2
I documenti NSFileManager hanno questo da dire in Considerazioni sul thread: "I metodi dell'oggetto NSFileManager condiviso possono essere chiamati in modo sicuro da più thread". L'unica eccezione che notano è se si intende gestire i callback dei delegati dalle operazioni del file manager; Non credo che si applichi qui.
Tim

Nota che il percorso è 'Full Path' del file, che puoi trovare sotto File Inspector di XCode
Burak

29

Per ottenere questo lavoro devi solo fare:

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

Assicurati che il tuo URL locale inizi con "file: //", quindi dovresti solo fare questo:

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

url viene sempre restituito come assets-library: //asset/asset.MOV? id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70 & ext = MOV @ahbou
Mansuu ....

Questo è valido solo per le risorse (foto e video). L'OP sta chiedendo un file dalla cartella dei documenti
ahbou

quando creo un oggetto dati dall'URL selezionato per asset_library mi dà zero @ahbou
Mansuu ....

Le risorse vengono gestite solo da AssetsLibrary o Photos.framework. Per recuperare una risorsa è necessario chiamare asset.assetForURL {} Cerca questo metodo o poni una nuova domanda poiché si tratta di un argomento separato.
ahbou

0

Per swift3 ho trovato utile la risposta dal seguente URL

(Stavo ottenendo il seguente percorso, dopo aver catturato l'immagine usando il 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) {// Add code of Alamofire here}


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.