iPhone - NSData z adresu URL pliku lokalnego

85

Mam NSURLobiekt, który daje mi ścieżkę do pliku lokalnego (w folderze dokumentów). Chcę wypełnić NSDataobiekt zawartością tego pliku. Próbowałem używać, dataWithContentsOfURL:ale to się nie udaje. Wiem, że plik istnieje, ponieważ iPhone SDKzwraca ścieżkę.

Czy ktoś może mi powiedzieć, jak mogę uzyskać NSDataobiekt z URLpliku lokalnego?

Dzięki.

lostInTransit
źródło
Co oznacza „ale zawodzi”?
Marco
Oznacza to, że w tym momencie zawiesza się! Daje wyjątek. Próbuję uzyskać dostęp do danych wideo, którego adres URL otrzymujemy z UIImagePickerController
lostInTransit
Wygląda na to, że próbujesz przekazać obiekt, który nie jest NURL. Jak otrzymujesz adres URL pliku, czy na pewno jest to adres URL, a nie NSString?
Marco
@AliKhaki: Proszę nie wprowadzać błahych zmian, potrzeba dwóch osób w kolejce recenzji, aby przejrzeć wprowadzone zmiany. Jeśli edytujesz pytanie, aby je poprawić, możesz usunąć niepotrzebne rzeczy, takie jak „dziękuję”, ale nie edytuj pytania tylko w tym celu. Dzięki!
Cris Luengo

Odpowiedzi:

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

Kod SWIFT:

let data = FileManager.default.contents(atPath: path)
Tim
źródło
1
contentOfFile przyjmuje ciąg NSString ze ścieżką do pliku. Otrzymuję obiekt NSURL.
lostInTransit
Nie jestem pewien, ale używając defaultManager zamiast alokacji, init może powodować problemy z wątkami.
carlossless
2
Dokumentacja NSFileManager ma do powiedzenia w Rozważaniach dotyczących wątków: „Metody współużytkowanego obiektu NSFileManager można bezpiecznie wywoływać z wielu wątków”. Jedynym wyjątkiem, na który zwracają uwagę, jest sytuacja, gdy zamierzasz obsługiwać wywołania zwrotne delegatów z operacji menedżera plików; Nie sądzę, żeby to miało tutaj zastosowanie.
Tim
Zwróć uwagę, że ścieżką jest „Pełna ścieżka” pliku, którą można znaleźć w Inspektorze plików XCode
Burak
29

Aby uzyskać tę pracę, wystarczy wykonać:

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
źródło
2

Upewnij się, że lokalny adres URL zaczyna się od „file: //”, wtedy wystarczy zrobić to:

 NSData *fileData = [NSData dataWithContentsOfFile:fileURL.path];
ahbou
źródło
adres URL jest zawsze zwracany jako biblioteka-zasobów: //asset/asset.MOV? id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70 & ext = MOV @ahbou
Mansuu ....
Dotyczy to tylko zasobów (zdjęć i filmów). OP jest pytany o plik z folderu dokumentów
ahbou
kiedy tworzę obiekt danych z wybranego adresu URL z biblioteki asset_library, daje mi zero @ahbou
Mansuu ....
Zasoby są obsługiwane tylko przez bibliotekę AssetsLibrary lub Photos.framework. Aby pobrać zasób, musisz wywołać asset.assetForURL {} Wyszukaj tę metodę lub zadaj nowe pytanie, ponieważ jest to osobny temat.
ahbou
0

Dla swift3 pomocna okazała się odpowiedź z następującego adresu URL

(Otrzymywałem następującą ścieżkę, po przechwyceniu obrazu za pomocą wtyczki phonegap

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

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

jeśli niech videoURL = URL (string: urlString), niech videodata = try? Data (contentOf: videoURL) {// Dodaj tutaj kod Alamofire}

Chirag Purohit
źródło
0
guard let data = FileManager.default.contents(atPath: path) else
    { ...
Anton Tropashko
źródło