iOS從系統(tǒng)“文件管理”APP選擇文件上傳以及保存文件到“文件”APP

一、從系統(tǒng)“文件”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 支持的文件類型數(shù)組
 "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];
        // 設(shè)置代理
        _documentPickerVC.delegate = self;
        // 設(shè)置模態(tài)彈出方式
        _documentPickerVC.modalPresentationStyle = UIModalPresentationFormSheet;
    }
    return _documentPickerVC;
}
 
#pragma mark - UIDocumentPickerDelegate
 
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
    // 獲取授權(quán)
    BOOL fileUrlAuthozied = [urls.firstObject startAccessingSecurityScopedResource];
    if (fileUrlAuthozied) {
        // 通過(guò)文件協(xié)調(diào)工具來(lái)得到新的文件地址,以此得到文件保護(hù)功能
        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) {
                // 讀取出錯(cuò)
            } else {
                // 上傳
                NSLog(@"fileName : %@", fileName);
                // [self uploadingWithFileData:fileData fileName:fileName fileURL:newURL];
            }
            [self dismissViewControllerAnimated:YES completion:NULL];
        }];
        [urls.firstObject stopAccessingSecurityScopedResource];
    } else {
        // 授權(quán)失敗
    }
}
 
@end

二恐似、從開(kāi)發(fā)APP中保存文件到系統(tǒng)“文件”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:@"下載文件要求手機(jī)系統(tǒng)版本在11.0以上"];
        return;
    }
    /**
    /// 保存網(wǎng)絡(luò)文件到沙盒一
    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];
    */
    /// 保存網(wǎng)絡(luò)文件到沙盒二
    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];
        // 設(shè)置代理
        documentPickerVC.delegate = self;
        // 設(shè)置模態(tài)彈出方式
        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];
    // 判斷是否存在,不存在則創(chuàng)建
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // fileExistsAtPath 判斷一個(gè)文件或目錄是否有效,isDirectory判斷是否一個(gè)目錄
    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 {
    // 獲取授權(quán)
    BOOL fileUrlAuthozied = [urls.firstObject startAccessingSecurityScopedResource];
    if (fileUrlAuthozied) {
        // 通過(guò)文件協(xié)調(diào)工具來(lái)得到新的文件地址,以此得到文件保護(hù)功能
        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) {
                // 讀取出錯(cuò)
            } else {
                // 上傳
                NSLog(@"fileName : %@", fileName);
            }
        }];
        [urls.firstObject stopAccessingSecurityScopedResource];
    } else {
        // 授權(quán)失敗
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苏潜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌变勇,老刑警劉巖恤左,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異搀绣,居然都是意外死亡飞袋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門链患,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巧鸭,“玉大人,你說(shuō)我怎么就攤上這事麻捻「偃裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵贸毕,是天一觀的道長(zhǎng)巷折。 經(jīng)常有香客問(wèn)我,道長(zhǎng)崖咨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任油吭,我火速辦了婚禮击蹲,結(jié)果婚禮上署拟,老公的妹妹穿的比我還像新娘。我一直安慰自己歌豺,他們只是感情好推穷,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著类咧,像睡著了一般馒铃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痕惋,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天区宇,我揣著相機(jī)與錄音,去河邊找鬼值戳。 笑死议谷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的堕虹。 我是一名探鬼主播卧晓,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赴捞!你這毒婦竟也來(lái)了逼裆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赦政,失蹤者是張志新(化名)和其女友劉穎胜宇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昼钻,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掸屡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了然评。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仅财。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碗淌,靈堂內(nèi)的尸體忽然破棺而出盏求,到底是詐尸還是另有隱情,我是刑警寧澤亿眠,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布碎罚,位于F島的核電站,受9級(jí)特大地震影響纳像,放射性物質(zhì)發(fā)生泄漏荆烈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憔购。 院中可真熱鬧宫峦,春花似錦、人聲如沸玫鸟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屎飘。三九已至妥曲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钦购,已是汗流浹背檐盟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肮雨,地道東北人遵堵。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像怨规,于是被迫代替她去往敵國(guó)和親陌宿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 上傳文件到服務(wù)器是一個(gè)常用的操作波丰,而在服務(wù)器上保存文件就需要多多用心了壳坪。因?yàn)槟悴豢赡苤辉谝粋€(gè)路徑里保存文件,所以需...
    厚土火焱閱讀 2,013評(píng)論 2 0
  • 1.什么是FastDFS掰烟? FastDFS是用c語(yǔ)言編寫的一款開(kāi)源的分布式文件系統(tǒng)爽蝴。FastDFS為互聯(lián)網(wǎng)量身定制...
    中庸逍遙閱讀 1,372評(píng)論 0 2
  • 概述 一說(shuō)到文件上傳,想必大家都并不陌生纫骑,更何況是利用AFNetworking(PS:后期統(tǒng)稱AF)來(lái)做蝎亚,那更是小...
    CoderMikeHe閱讀 13,437評(píng)論 48 133
  • 久違的晴天,家長(zhǎng)會(huì)先馆。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí)发框,離放學(xué)已經(jīng)沒(méi)多少時(shí)間了。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)煤墙。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,495評(píng)論 16 22
  • 今天感恩節(jié)哎梅惯,感謝一直在我身邊的親朋好友。感恩相遇仿野!感恩不離不棄铣减。 中午開(kāi)了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,551評(píng)論 0 11