美文网首页iOS各种疑难杂症iOS 常见问题
iOS从系统“文件管理”APP选择文件上传以及保存文件到“文件”

iOS从系统“文件管理”APP选择文件上传以及保存文件到“文件”

作者: 幽玄727 | 来源:发表于2020-11-25 16:45 被阅读0次

    一、从系统“文件”APP选择文件上传

    #import "ViewController.h"
     
    @interface ViewController () <UIDocumentPickerDelegate>
     
    @property (nonatomic, strong) UIDocumentPickerViewController *documentPickerVC;
     
    @end
     
    @implementation ViewController
     
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
     
    - (IBAction)tapSelectFileAction:(id)sender {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.35 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self presentViewController:self.documentPickerVC animated:YES completion:nil];
        });
    }
     
    /**
     初始化 UIDocumentPickerViewController
     
     @param allowedUTIs 支持的文件类型数组
     "public.content",
     "public.text",
     "public.source-code",
     "public.image",
     "public.audiovisual-content",
     "com.adobe.pdf",
     "com.apple.keynote.key",
     "com.microsoft.word.doc",
     "com.microsoft.excel.xls",
     "com.microsoft.powerpoint.ppt"
     @param mode 支持的共享模式
     */
    - (UIDocumentPickerViewController *)documentPickerVC {
        if (!_documentPickerVC) {
            NSArray *types = @[@"public.content",@"public.text"];
            self.documentPickerVC = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:types inMode:UIDocumentPickerModeOpen];
            // 设置代理
            _documentPickerVC.delegate = self;
            // 设置模态弹出方式
            _documentPickerVC.modalPresentationStyle = UIModalPresentationFormSheet;
        }
        return _documentPickerVC;
    }
     
    #pragma mark - UIDocumentPickerDelegate
     
    - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
        // 获取授权
        BOOL fileUrlAuthozied = [urls.firstObject startAccessingSecurityScopedResource];
        if (fileUrlAuthozied) {
            // 通过文件协调工具来得到新的文件地址,以此得到文件保护功能
            NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] init];
            NSError *error;
            
            [fileCoordinator coordinateReadingItemAtURL:urls.firstObject options:0 error:&error byAccessor:^(NSURL *newURL) {
                // 读取文件
                NSString *fileName = [newURL lastPathComponent];
                NSError *error = nil;
                NSData *fileData = [NSData dataWithContentsOfURL:newURL options:NSDataReadingMappedIfSafe error:&error];
                if (error) {
                    // 读取出错
                } else {
                    // 上传
                    NSLog(@"fileName : %@", fileName);
                    // [self uploadingWithFileData:fileData fileName:fileName fileURL:newURL];
                }
                [self dismissViewControllerAnimated:YES completion:NULL];
            }];
            [urls.firstObject stopAccessingSecurityScopedResource];
        } else {
            // 授权失败
        }
    }
     
    @end
    

    二、从开发APP中保存文件到系统“文件”APP

    #pragma mark - 下载文件
    /// http://jadinec-test.oss-accelerate.aliyuncs.com/excelFile/a5f23e130d5e4dd7adda942c45207927.pdf
    - (void)downLoadWithFilePath:(NSString *)filePath {
        float version = [[[UIDevice currentDevice] systemVersion] floatValue];
        if (version >= 11) {
            
        } else {
            [MBProgressHUD showError:@"下载文件要求手机系统版本在11.0以上"];
            return;
        }
        /**
        /// 保存网络文件到沙盒一
        NSURLRequest *req = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:filePath]];
        NSData *fileData = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];
        NSString *temp = NSTemporaryDirectory();
        NSFileManager *fm = [NSFileManager defaultManager];
        NSString *fullPath = [self getNativeFilePath:[filePath componentsSeparatedByString:@"/"].lastObject];
        BOOL downResult = [fm createFileAtPath:fullPath contents:fileData attributes:nil];
        */
        /// 保存网络文件到沙盒二
        NSData *fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]];
        NSString *fullPath = [self getNativeFilePath:[filePath componentsSeparatedByString:@"/"].lastObject];
        BOOL downResult = [fileData writeToFile:fullPath atomically:YES];
        
        if (downResult) {
            UIDocumentPickerViewController *documentPickerVC = [[UIDocumentPickerViewController alloc] initWithURL:[NSURL fileURLWithPath:fullPath] inMode:UIDocumentPickerModeExportToService];
            // 设置代理
            documentPickerVC.delegate = self;
            // 设置模态弹出方式
            documentPickerVC.modalPresentationStyle = UIModalPresentationFormSheet;
            [self.navigationController presentViewController:documentPickerVC animated:YES completion:nil];
        }
    }
     
    // 获得文件沙盒地址
    - (NSString *)getNativeFilePath:(NSString *)fileName {
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *munu = [NSString stringWithFormat:@"%@/%@",@"downLoad",fileName];
        NSString *filePath = [path stringByAppendingPathComponent:munu];
        // 判断是否存在,不存在则创建
        NSFileManager *fileManager = [NSFileManager defaultManager];
        // fileExistsAtPath 判断一个文件或目录是否有效,isDirectory判断是否一个目录
        BOOL isDir = NO;
        NSMutableArray *theArr = [[filePath componentsSeparatedByString:@"/"] mutableCopy];
        [theArr removeLastObject];
        NSString *thePath = [theArr componentsJoinedByString:@"/"];
        BOOL existed = [fileManager fileExistsAtPath:thePath isDirectory:&isDir];
        if ( !(isDir == YES && existed == YES) ) { // 如果文件夹不存在
            [fileManager createDirectoryAtPath:thePath withIntermediateDirectories:YES attributes:nil error:nil];
        }
        return filePath;
    }
     
    #pragma mark - UIDocumentPickerDelegate
     
    - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
        // 获取授权
        BOOL fileUrlAuthozied = [urls.firstObject startAccessingSecurityScopedResource];
        if (fileUrlAuthozied) {
            // 通过文件协调工具来得到新的文件地址,以此得到文件保护功能
            NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] init];
            NSError *error;
            
            [fileCoordinator coordinateReadingItemAtURL:urls.firstObject options:0 error:&error byAccessor:^(NSURL *newURL) {
                // 读取文件
                NSString *fileName = [newURL lastPathComponent];
                NSError *error = nil;
                //NSData *fileData = [NSData dataWithContentsOfURL:newURL options:NSDataReadingMappedIfSafe error:&error];
                if (error) {
                    // 读取出错
                } else {
                    // 上传
                    NSLog(@"fileName : %@", fileName);
                }
            }];
            [urls.firstObject stopAccessingSecurityScopedResource];
        } else {
            // 授权失败
        }
    }
    

    相关文章

      网友评论

        本文标题:iOS从系统“文件管理”APP选择文件上传以及保存文件到“文件”

        本文链接:https://www.haomeiwen.com/subject/tlmniktx.html