查看: 2115|回复: 0

[IOS开发教程] ios总结笔记 -- 下载预览pdf/word/png/doc/xls/docx...文件

发表于 2018-1-29 08:00:02

直接上代码
DownLoadManager.h

  1. @interface DiskDownLoadManager : NSObject
  2. @property (nonatomic,copy) void(^checkDiskFile)(NSString *);
  3. +(instancetype)shareManager;
  4. - (BOOL)getFile:(DiskItemModel *)model;
  5. //预览文档
  6. - (void)checkFileDisk:(DiskItemModel *)model;
  7. @end
复制代码

DownLoadManager.m

  1. +(instancetype)allocWithZone:(struct _NSZone *)zone
  2. {
  3. // [url=home.php?mod=space&uid=24215]@synchronized[/url] (self) {
  4. // // 为了防止多线程同时访问对象,造成多次分配内存空间,所以要加上线程锁
  5. // if (_instance == nil) {
  6. // _instance = [super allocWithZone:zone];
  7. // }
  8. // return _instance;
  9. // }
  10. // 也可以使用一次性代码
  11. static dispatch_once_t onceToken;
  12. dispatch_once(&onceToken, ^{
  13. if (_instance == nil) {
  14. _instance = [super allocWithZone:zone];
  15. }
  16. });
  17. return _instance;
  18. }
  19. // 为了使实例易于外界访问 我们一般提供一个类方法
  20. // 类方法命名规范 share类名|default类名|类名
  21. +(instancetype)shareManager
  22. {
  23. //return _instance;
  24. // 最好用self 用Tools他的子类调用时会出现错误
  25. return [[self alloc]init];
  26. }
  27. // 为了严谨,也要重写copyWithZone 和 mutableCopyWithZone
  28. -(id)copyWithZone:(NSZone *)zone
  29. {
  30. return _instance;
  31. }
  32. -(id)mutableCopyWithZone:(NSZone *)zone
  33. {
  34. return _instance;
  35. }
  36. //预览文档
  37. - (void)checkFileDisk:(DiskItemModel *)model
  38. {
  39. NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
  40. NSString *headerPath = [NSString stringWithFormat:@"%@/%@/%@/",path,@"MyDisk",@"ziliao"];
  41. NSFileManager *fileManager = [NSFileManager defaultManager];
  42. NSString *filePath = [headerPath stringByAppendingPathComponent:model.dataName]; //docPath为文件名
  43. if (![fileManager fileExistsAtPath:filePath]) {
  44. if (![fileManager fileExistsAtPath:headerPath]) {
  45. [fileManager createDirectoryAtPath:headerPath withIntermediateDirectories:YES attributes:nil error:nil];
  46. }
  47. [self downloadDocxWithFilePath:filePath dataId:model.dataId];
  48. }else{//文件已下载的情况下,直接回调,参数是文件路径
  49. if (_checkDiskFile) {
  50. _checkDiskFile(filePath);
  51. }
  52. }
  53. }
复制代码
  1. /**
  2. 下载文件
  3. @param docPath 文件路径
  4. @param fileName 文件名
  5. */
  6. -(void)downloadDocxWithFilePath:(NSString *)filePath dataId:(NSString *)dataId {
  7. //下载文件通常用的方法,自己另行配置,下面的文件下载只是针对接口,我觉得并不好
  8. NSString *urlString = APIBASE;
  9. AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:APIBASE]];
  10. manager.responseSerializer.acceptableContentTypes=[NSSet setWithObjects: @"application/json", @"text/json", @"text/javascript",@"text/html",@"text/xml",@"text/plain",nil];
  11. manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // AFN不会解析,数据是data,需要自己解析
  12. NSFileManager *fileManager = [NSFileManager defaultManager];
  13. NSDictionary *parameters = @{@"dataIds":dataId};
  14. NSURLSessionDataTask *task = [manager POST:API_DiskDownLoad parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  15. BOOL result = [fileManager createFileAtPath:filePath contents:(NSData *)responseObject attributes:nil];
  16. if (result) {
  17. NSLog(@"============写入成功");
  18. //文件已经存在,直接打开
  19. if (_checkDiskFile) {
  20. _checkDiskFile(filePath);
  21. }
  22. }
  23. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  24. }];
  25. [task resume];//开始下载 要不然不会进行下载的
  26. }
复制代码

要打开的地方

  1. /**
  2. 打开文件
  3. @param filePath 文件路径
  4. */
  5. -(void)openDocxWithPath:(NSString *)filePath {
  6. UIDocumentInteractionController *doc= [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];
  7. doc.delegate = self;
  8. [doc presentPreviewAnimated:YES];
  9. }
  10. #pragma mark - UIDocumentInteractionControllerDelegate
  11. //必须实现的代理方法 预览窗口以模式窗口的形式显示,因此需要在该方法中返回一个view controller ,作为预览窗口的父窗口。如果你不实现该方法,或者在该方法中返回 nil,或者你返回的 view controller 无法呈现模式窗口,则该预览窗口不会显示。
  12. - (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{
  13. return self;
  14. }
  15. - (UIView*)documentInteractionControllerViewForPreview:(UIDocumentInteractionController*)controller {
  16. return self.view;
  17. }
  18. - (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController*)controller {
  19. return CGRectMake(0, 30, kSCREEN_WIDTH, kSCREEN_HEIGHT);
  20. }
复制代码


回复

使用道具 举报