UIDocumentPickerViewController有四种模式:
1 typedef NS_ENUM(NSUInteger, UIDocumentPickerMode) {
2 UIDocumentPickerModeImport,
3 UIDocumentPickerModeOpen,
4 UIDocumentPickerModeExportToService,
5 UIDocumentPickerModeMoveToService
6 } API_DEPRECATED("Use appropriate initializers instead",ios(8.0,14.0)) API_UNAVAILABLE(tvos);
UIDocumentPickerModeImport
:用户选择一个外部文档,文档选择器拷贝该文档到应用沙盒,不会修改源文档。
UIDocumentPickerModeOpen:打开一个外部文档,用户可以修改该文档。
UIDocumentPickerModeExportToService:文档选择器拷贝文档到一个外部路径,不会修改源文档。
UIDocumentPickerModeMoveToService
:拷贝文档到外部路径,同时可以修改该拷贝。
1、下载文件存储到iPhone 本地文件夹
1 -(void)requestImageUrl:(NSString *)imageUrl {
2 [[DDLoading shared] show];
4 // // 下载图片之前先检查本地是否已经有图片
5 // UIImage * image = [self loadLocalImage:imageUrl];
6 // NSData *imageData = UIImagePNGRepresentation(image);
7 // //如果图片存在直接跳出;不用下载了
8 // if (imageData) {
9 // self.successBlock(imageData);
10 // return;
11 // }
13 // 没有本地图片
14 // 创建URL对象
15 // NSURL *url = [NSURL URLWithString:[imageUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
16 NSURL *url = [NSURL URLWithString:[imageUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];
17 // 创建request对象
18 NSURLRequest *request = [NSURLRequest requestWithURL:url];
20 // 使用URLSession来进行网络请求
21 // 创建会话配置对象
22 NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
23 // 创建会话对象
24 NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
25 // 创建会话任务对象
26 NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
27 if (data) {
28 // 将下载的数据传出去,进行UI更新
29 DebugLog(@"文件下载成功~~~~~~%@",data);
30 // 下载完成,将图片保存到本地
31 [data writeToFile:[self imageFilePath:imageUrl] atomically:YES];
33 dispatch_async(dispatch_get_main_queue(), ^{
34 //遮罩关闭
35 NSString * urlPath =[self imageFilePath:imageUrl] ;
36 UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"file://%@",urlPath]] inMode:UIDocumentPickerModeExportToService];
37 documentPicker.delegate = self;
38 documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;
39 [Singleton.rootViewController presentViewController:documentPicker animated:YES completion:nil];
40 });
43 }
44 if (error) {
45 DebugLog(@"文件下载失败~~~~~~%@",error);
46 dispatch_async(dispatch_get_main_queue(), ^{
47 //遮罩关闭
48 });
49 self.jsapiCallback(@{@"result":@"0",@"errorMsg":@"文件下载失败"});
50 // 51 //
52 }
53 }];
55 // 创建的task都是挂起状态,需要resume才能执行
56 [task resume];
57 }
58 - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray <NSURL *>*)urls {
59 DebugLog(@"*************************存储成功");
60 DebugLog(@"*************************%@",urls);
61 self.jsapiCallback(@{@"result":@"1"});
62 }
64 // called if the user dismisses the document picker without selecting a document (using the Cancel button)
65 - (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller{
66 DebugLog(@"*************************存储失败");
67 self.jsapiCallback(@{@"result":@"0",@"errorMsg":@"用户取消操作"});
68 }
70 - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url{
71 DebugLog(@"*************************");
72 }
73 //
74 - (NSString *)imageFilePath:(NSString *)imageUrl {
75 // 1、获取caches文件夹路径
76 NSString * cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
78 // 2、创建DownloadImages文件夹
79 NSString * downloadImagesPath = [cachesPath stringByAppendingPathComponent:@"DownloadImages"];
81 // 3、创建文件管理器对象
82 NSFileManager * fileManager = [NSFileManager defaultManager];
84 // 4、判断文件夹是否存在
85 if (![fileManager fileExistsAtPath:downloadImagesPath])
86 {
87 [fileManager createDirectoryAtPath:downloadImagesPath withIntermediateDirectories:YES attributes:nil error:nil];
88 }
90 // 5、拼接图片在沙盒中的路径
91 /*
92 因为每一个图片URL对应的是一张图片,而且URL中包含了文件的名称,所以可以用图片的URL来唯一表示图片的名称
93 因为图像URL中有"/","/"表示的是下级目录的意思,要在存入前替换掉,所以用"_"代替
94 */
95 NSArray *imageArr = [imageUrl componentsSeparatedByString:@"/"];
96 NSString * imageName = [imageArr lastObject];
97 NSString * imageFilePath = [downloadImagesPath stringByAppendingPathComponent:imageName];
99 // 6、返回文件路径
100 return imageFilePath;
101 }
2、选择iPhone本地文件送给服务端
1 - (IBAction)shareAction:(id)sender {
2 NSArray *types = @[@"public.content"];可选文件类型 types需要传入一个uniform type identifiers (UTIs)数组。关于UTIs的官方文档
3 UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:types inMode:UIDocumentPickerModeOpen];
4 documentPicker.delegate = self;
5 documentPicker.modalPresentationStyle = UIModalPresentationPageSheet;
6 [self presentViewController:documentPicker animated:YES completion:nil];
10 - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
11 BOOL canAccessingResource = [url startAccessingSecurityScopedResource];
12 if(canAccessingResource) {
13 NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] init];
14 NSError *error;
15 [fileCoordinator coordinateReadingItemAtURL:url options:0 error:&error byAccessor:^(NSURL *newURL) {
16 NSData *fileData = [NSData dataWithContentsOfURL:newURL];
17 NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
18 NSString *documentPath = [arr lastObject];
19 NSString *desFileName = [documentPath stringByAppendingPathComponent:@"file"];
20 [fileData writeToFile:desFileName atomically:YES];
21 NSLog(@"point_test_log%@",desFileName);
22 [self dismissViewControllerAnimated:YES completion:NULL];
23 }];
24 if (error) {
25 // error handing
26 }
27 } else {
28 // startAccessingSecurityScopedResource fail
29 }
30 [url stopAccessingSecurityScopedResource];