[iOS]从系统“文件”APP选择文件上传以及保存文件到“文件”APP
#import "ViewController.h"@interface ViewController () <UIDocumentPickerDelegate>@property (nonatomic, strong) UIDocumentPickerViewController *documentPickerVC;@end@implementation ViewController
·
一、从系统“文件”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 {
// 授权失败
}
}
TO:
UIDocumentPickerViewController
https://blog.csdn.net/u014084081/article/details/94563298
UIDocumentPickerViewController.h
https://www.jianshu.com/p/75eb512811d9
iOS让APP中的文件在系统的File应用显示
https://www.jianshu.com/p/0d0f2be26cec
UIDocumentPickerViewController和UIDocumentInteractionController
https://www.cnblogs.com/zhouhui231/p/12183125.html
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献22条内容
所有评论(0)