为了账号安全,请及时绑定邮箱和手机立即绑定

ios总结笔记 -- 下载预览pdf/word/png/doc/xls/docx...文件

标签:
iOS

直接上代码
DownLoadManager.h

@interface DiskDownLoadManager : NSObject

@property (nonatomic,copy) void(^checkDiskFile)(NSString *);

+(instancetype)shareManager;

- (BOOL)getFile:(DiskItemModel *)model;

///预览文档
- (void)checkFileDisk:(DiskItemModel *)model;

@end

DownLoadManager.m


+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    //    @synchronized (self) {
    //        // 为了防止多线程同时访问对象,造成多次分配内存空间,所以要加上线程锁
    //        if (_instance == nil) {
    //            _instance = [super allocWithZone:zone];
    //        }
    //        return _instance;
    //    }
    // 也可以使用一次性代码
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (_instance == nil) {
            _instance = [super allocWithZone:zone];
        }
    });
    return _instance;
}
// 为了使实例易于外界访问 我们一般提供一个类方法
// 类方法命名规范 share类名|default类名|类名
+(instancetype)shareManager
{
    //return _instance;
    // 最好用self 用Tools他的子类调用时会出现错误
    return [[self alloc]init];
}
// 为了严谨,也要重写copyWithZone 和 mutableCopyWithZone
-(id)copyWithZone:(NSZone *)zone
{
    return _instance;
}
-(id)mutableCopyWithZone:(NSZone *)zone
{
    return _instance;
}

///预览文档
- (void)checkFileDisk:(DiskItemModel *)model
{
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    NSString *headerPath = [NSString stringWithFormat:@"%@/%@/%@/",path,@"MyDisk",@"ziliao"];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *filePath = [headerPath stringByAppendingPathComponent:model.dataName]; //docPath为文件名

    if (![fileManager fileExistsAtPath:filePath]) {
        if (![fileManager fileExistsAtPath:headerPath]) {
            [fileManager createDirectoryAtPath:headerPath withIntermediateDirectories:YES attributes:nil error:nil];
        }
        [self downloadDocxWithFilePath:filePath dataId:model.dataId];
    }else{//文件已下载的情况下,直接回调,参数是文件路径
        if (_checkDiskFile) {
            _checkDiskFile(filePath);
        }
    }
}
/**
 下载文件

 @param docPath 文件路径
 @param fileName 文件名
 */
-(void)downloadDocxWithFilePath:(NSString *)filePath dataId:(NSString *)dataId {
//下载文件通常用的方法,自己另行配置,下面的文件下载只是针对接口,我觉得并不好
    NSString *urlString = APIBASE;
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:APIBASE]];
    manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects: @"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/plain",nil];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // AFN不会解析,数据是data,需要自己解析
    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSDictionary *parameters = @{@"dataIds":dataId};

    NSURLSessionDataTask *task = [manager POST:API_DiskDownLoad parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        BOOL result = [fileManager createFileAtPath:filePath contents:(NSData *)responseObject attributes:nil];
        if (result) {
           NSLog(@"============写入成功");
            //文件已经存在,直接打开
            if (_checkDiskFile) {
                _checkDiskFile(filePath);
            }
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

    }];
    [task resume];//开始下载 要不然不会进行下载的

}

要打开的地方

/**
 打开文件

 @param filePath 文件路径
 */
-(void)openDocxWithPath:(NSString *)filePath {

    UIDocumentInteractionController *doc= [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];
    doc.delegate = self;
    [doc presentPreviewAnimated:YES];
}

#pragma mark - UIDocumentInteractionControllerDelegate
//必须实现的代理方法 预览窗口以模式窗口的形式显示,因此需要在该方法中返回一个view controller ,作为预览窗口的父窗口。如果你不实现该方法,或者在该方法中返回 nil,或者你返回的 view controller 无法呈现模式窗口,则该预览窗口不会显示。

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{

    return self;
}

- (UIView*)documentInteractionControllerViewForPreview:(UIDocumentInteractionController*)controller {

    return self.view;
}

- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController*)controller {

    return CGRectMake(0, 30, kSCREEN_WIDTH, kSCREEN_HEIGHT);
}
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消