iPhone - 从本地文件URL获取NSData

88

我有一个NSURL对象,它给出了一个本地文件的路径(在文档文件夹中)。我想要用这个文件的内容填充一个NSData对象。尝试使用dataWithContentsOfURL:,但失败了。我知道该文件存在,因为iPhone SDK返回了路径。

请问有人可以告诉我如何从本地文件的URL获取一个NSData对象吗?

谢谢。


“but it fails” 是什么意思? - Marco
意思是程序在这个点上卡住了!抛出了一个异常。我正在尝试访问视频的数据,我们从UIImagePickerController中获得它的URL。 - lostInTransit
看起来你正在尝试传递一个不是 NURL 的对象。你是如何获取文件 URL 的?你确定它是一个 URL 而不是一个 NSString 吗? - Marco
@AliKhaki:请不要进行琐碎的编辑,这会让两个人在审核队列中查看您的更改。如果您编辑问题以改进它,请随意删除无用的内容,如“谢谢”,但不要仅仅为了那个而编辑问题。谢谢! - Cris Luengo
5个回答

170
// 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
contentsOfFile 接受一个文件路径的 NSString。我得到了一个 NSURL 对象。 - lostInTransit
我不确定,但是使用defaultManager而不是alloc、init可能会导致线程问题。 - carlossless
2
NSFileManager文档在线程考虑方面有这样的说明:“共享的NSFileManager对象的方法可以安全地从多个线程调用。”他们唯一指出的例外是,如果您打算处理文件管理器操作的委托回调; 我不认为这适用于此处。 - Tim
请注意,路径是文件的“完整路径”,您可以在XCode的“文件检查器”下找到它。 - Burak

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];

3

确保您的本地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
当我从asset_library中选择的url创建数据对象时,它会返回nil。@ahbou - Mansuu....
资产仅由AssetsLibrary或Photos.framework处理。要检索资产,您需要调用asset.assetForURL{}。搜索此方法或提出新问题,因为这是一个单独的主题。 - ahbou

0
guard let data = FileManager.default.contents(atPath: path) else
    { ...

0
对于Swift3,我发现以下URL的答案很有帮助:
(我使用phonegap插件捕获图像后得到以下路径
file:///var/mobile/Containers/Data/Application/B64B06DE-7976-45CF-9BE2-661F0F309A06/tmp/abcded.jpg)

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

如果让videoURL等于URL(string: urlString),并且让videodata等于try? Data(contentsOf: videoURL),那么就可以在这里添加Alamofire的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接