iPhone - NSData з URL-адреси локального файлу


85

У мене є NSURLоб'єкт, який надає мені шлях до локального файлу (у папці документів). Я хочу заповнити NSDataоб'єкт вмістом цього файлу. Спробував використовувати, dataWithContentsOfURL:але це не вдається. Я знаю, що файл існує, оскільки iPhone SDKповертає шлях.

Хтось може сказати мені, як я можу отримати NSDataоб’єкт із URLлокального файлу?

Дякую.


Що означає "але це не вдається"?
Марко

Означає, що в цей момент воно замерзає! Дає виняток. Я намагаюся отримати доступ до даних відео, URL-адресу якого ми отримуємо від UIImagePickerController
lostInTransit

Здається, ви намагаєтесь передати об’єкт, який не є NURL. Як ви отримуєте URL-адресу файлу, ви впевнені, що це URL-адреса, а не NSString?
Марко

@AliKhaki: Будь ласка, не робіть тривіальних редагувань, для перегляду ваших змін потрібно дві людини в черзі огляду. Якщо ви редагуєте питання, щоб покращити його, сміливо видаляйте непотрібні речі, такі як "спасибі", але не редагуйте питання лише для цього. Дякую!
Кріс Луенго,

Відповіді:


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

Швидкий код:

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

1
contentsOfFile приймає NSString із шляхом до файлу. Я отримую об’єкт NSURL.
lostInTransit

Я не впевнений, але, використовуючи defaultManager замість alloc, init може спричинити проблеми з потоками.
безкарний

2
Документи NSFileManager мають це сказати в розділі Розгляд потоків: "Методи спільного об'єкта NSFileManager можна безпечно викликати з декількох потоків." Єдиний виняток, який вони відзначають, - це якщо ви збираєтесь обробляти зворотні виклики з операцій файлового менеджера; Я не вірю, що це стосується цього.
Тім

Зверніть увагу, що шлях - «Повний шлях» до файлу, який ви можете знайти у розділі Інспектор файлів XCode
Бурак,

29

Щоб отримати цю роботу, вам просто потрібно виконати:

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

Переконайтеся, що ваша локальна URL-адреса починається з "file: //", тоді вам просто потрібно буде зробити це:

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

url завжди повертається як бібліотека активів: //asset/asset.MOV? id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70 & ext = MOV @ahbou
Mansuu ....

Це справедливо лише для активів (фото та відео). ОП цікавить файл із папки з документами
ahbou

коли я створюю об'єкт даних із вибраної URL-адреси для activ_library, це дає мені нуль @ahbou
Mansuu ....

Активами обробляється лише Бібліотека AssetsLibrary або Photos.framework. Щоб отримати актив, вам потрібно зателефонувати activ.assetForURL {} Шукайте цей метод або задайте нове запитання, оскільки це окрема тема.
ahbou

0

Для swift3 я знайшов відповідь із наступної URL-адреси корисним

(Я отримував наступний шлях після захоплення зображення за допомогою плагіна phonegap

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

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

якщо нехай videoURL = URL (рядок: urlString), нехай videodata = спробувати? Дані (contentsOf: videoURL) {// Додати код Alamofire тут}


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.