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

85

У меня есть NSURLобъект, который дает мне путь к локальному файлу (в папке с документами). Я хочу заполнить NSDataобъект содержимым этого файла. Пытался использовать, dataWithContentsOfURL:но это не удалось. Я знаю, что файл существует, потому что iPhone SDKвозвращает путь.

Может кто-нибудь сказать мне, как я могу получить NSDataобъект из URLлокального файла?

Спасибо.

lostInTransit
источник
Что значит «но это не удается»?
Марко,
Значит, на этом этапе он зависает! Дает исключение. Я пытаюсь получить доступ к данным видео, 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];

Код Swift:

let data = FileManager.default.contents(atPath: path)
Тим
источник
1
ContentOfFile принимает NSString с путем к файлу. Я получаю объект NSURL.
lostInTransit 03
Я не уверен, но использование defaultManager вместо alloc, init может вызвать проблемы с потоками.
carlossless
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 всегда возвращается как assets-library: //asset/asset.MOV? id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70 & ext = MOV @ahbou
Mansuu ....
Это действительно только для активов (фото и видео). OP спрашивает о файле из папки с документами
ahbou
когда я создаю объект данных из выбранного URL-адреса из asset_library, он дает мне nil @ahbou
Mansuu ....
Активы обрабатываются только AssetsLibrary или Photos.framework. Чтобы получить актив, вам нужно вызвать asset.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 = try? Data (contentsOf: videoURL) {// Добавьте сюда код Alamofire}

Чираг Пурохит
источник
0
guard let data = FileManager.default.contents(atPath: path) else
    { ...
Антон Тропашко
источник