在项目里遇到了 一个需求,要加载存储在本地沙盒下的文件,因为文件类型比较杂,有可能是.doc 或者 .docx 或者.pdf 或者图片 所以也在网上找了很多方法 总结一下 都不太好用 最后选择用UIWebView来做, 但是缺陷是 加载出来的文件 不可以编辑,所以需要编辑的老铁可以直接忽略此篇. 下面开始说我是怎么做的.(封装了一个文件下载与查看的框架 放到了github上供大家下载,有详细的demo 使用直接把TZHFileManager 拖进项目的资源路径下即可,集成也相当简单,只需要两步,demo里已做了详细的说明,有兴趣的老铁可以下载下来看看
https://github.com/TZHui/TZHFileManager
)
1.创建控制器,创建UIwebView的对象,用来加载本地文件
#import "WebInfoViewController.h"
@interface WebInfoViewController ()<UIWebViewDelegate>
@property(strong, nonatomic)UIWebView *loadWebView;
@end
@implementation WebInfoViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.automaticallyAdjustsScrollViewInsets = NO;
self.loadWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 64, SWIDTH, SHEIGHT - 64)];
_loadWebView.backgroundColor = [UIColor whiteColor];
_loadWebView.delegate = self;
_loadWebView.scalesPageToFit = YES;
[self loadFile];
}
2.根据文件名 拼接文件在沙盒路径下的地址
-(void)loadFile{
[self.view addSubview:_loadWebView];
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
//由于沙盒地址是不断变化的,所以文件地址要用系统获取到的沙盒地址 再拼接文件名,即为文件在沙盒路径下的地址,但是前提是文件在沙盒下一级目录下,如果文件存在沙盒子目录下的一个文件夹中,对应的 地址即为:沙盒地址 + 文件夹名 + 文件名;
NSString *filePathA = [cachePath stringByAppendingPathComponent:你要加载的文件名如: 报名表.doc];
NSURL *url = [NSURL fileURLWithPath:filePathA];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[_loadWebView loadRequest:request];
}
以上就可以显示出对应的本地文件了,下面po几张本人写的demo效果图:
(1).加载PDF doc docx(也可以加载Excel )
(2)以下是加载图片效果
P.S. 本人遇到的最大坑点 po出来与大家分享:
之前本人异步下载文件到本地时 为了防止文件重名被覆盖,所以采用了md5将初始文件名转译了一下,以转译后的md5字符串作为文件名 但是就出现了一个非常大的问题,我存在本地的文件都没有文件类型后缀,正确的存储名应该如下: 报名表.doc ,但是我md5后 变成79d8ad7508b7910f007c62dafa257491
写到这里大家有没有发现什么问题,对!就是我存储在本地的文件名没有.doc后缀了!这就导致了UIWebView即使得到了本地文件的URL,但是无法识别文件的类型,导致无法加载,楼主当时被卡了好久,本地文件下载 也没问题 ,打印沙盒地址 也有对应的文件 ,但是就是不加载出来,楼主一度怀疑UIWebVIew 是否真的可以加载本地文件,好啦 不说了 这真的是一个很大的坑点啊! 看到此篇的老铁一定要注意:下载下来的本地文件,存储在沙盒中,文件名一定要有文件类型后缀!否则UIWebView是加载不出来的!
原创不易啊!喜欢的话就关注我吧