iPhone - 来自本地文件 URL 的 NSData

Posted

技术标签:

【中文标题】iPhone - 来自本地文件 URL 的 NSData【英文标题】:iPhone - NSData from local file's URL 【发布时间】:2010-12-03 14:45:57 【问题描述】:

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

谁能告诉我如何从本地文件的URL 中获取NSData 对象?

谢谢。

【问题讨论】:

“但它失败了”是什么意思? 意味着它在此时冻结!给出一个例外。我正在尝试访问视频的数据,我们从 UIImagePickerController 获得的 URL 似乎您正在尝试传递一个不是 NURL 的对象。您如何获取文件 URL,您确定是 URL 而不是 NSString? @AliKhaki:请不要进行微不足道的编辑,审核队列中需要两个人才能查看您的更改。如果您编辑问题以改进它,请随意删除“谢谢”之类的无用内容,但不要仅仅为此而编辑问题。谢谢! 【参考方案1】:
// 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)

【讨论】:

contentsOfFile 接受一个带有文件路径的 NSString。我得到一个 NSURL 对象。 我不确定,但是使用 defaultManager 而不是 alloc,init 可能会导致线程问题。 NSFileManager docs 在线程注意事项下有这样的说法:“可以从多个线程安全地调用共享 NSFileManager 对象的方法。”他们注意到的唯一例外是,如果您打算处理来自文件管理器操作的委托回调;我认为这不适用于这里。 注意路径是文件的'Full Path',你可以在XCode的File Inspector下找到它【参考方案2】:

要完成这项工作,您只需要做:

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】:

确保您的本地网址以“file://”开头 那么你只需要这样做:

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

【讨论】:

url 总是返回 assets-library://asset/asset.MOV?id=095AA9E9-A4F5-4035-9A21-3CFF04F45C70&ext=MOV @ahbou 这仅对资产(照片和视频)有效。 OP 询问文档文件夹中的文件 当我从 assets_library 的选定 url 创建数据对象时,它给了我 nil @ahbou 资产仅由 AssetsLibrary 或 Photos.framework 处理。要检索资产,您需要调用 assets.assetForURL 搜索此方法或提出新问题,因为这是一个单独的主题。【参考方案4】:

对于 swift3,我从以下 URL 找到了有用的答案

( 在使用 phonegap 插件捕获图像后,我得到了以下路径

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

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

如果让 videoURL = URL(string: urlString),让 videodata = 试试?数据(内容:视频URL) //这里添加Alamofire的代码

【讨论】:

【参考方案5】:
guard let data = FileManager.default.contents(atPath: path) else
     ...

【讨论】:

以上是关于iPhone - 来自本地文件 URL 的 NSData的主要内容,如果未能解决你的问题,请参考以下文章

从 iPhone 应用程序中的 URL 识别文件类型

带有来自 URL 的数组的 iPhone 选择器

如何保护来自 iphone 的网络服务 URL?

来自本地 HTML 文件的 WebView Javascript 跨域

在 iPhone HTML 邮件中显示本地图像

保存来自 URL 的流