網站首頁 編程語言 正文
本文實例為大家分享了iOS實現文件下載的具體代碼,供大家參考,具體內容如下
說明:
1).獲取網絡文件大??;
2).開啟循環,計算每段position開始與結束位置,通過Range頭字段按塊獲取文件數據流;
3).使用NSFileHandle追加方式將NSData文件數據寫入本地文件。
1、用HEAD請求方式獲取網絡文件大?。?/strong>
/*
?獲取網絡文件大小
?*/
- (long long)getNetFileLen:(NSURL *)url{
? ? //1.創建request
? ? NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:10];
? ? //設置請求方式為HEAD, 只獲取頭信息
? ? request.HTTPMethod = @"HEAD";
? ??
? ? //2.定義用于接收網絡數據的對象
? ? NSURLResponse *response = nil;
? ??
? ? //3.同步請求網絡,將結果存入response
? ? [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];
? ??
? ? //返回文件大小
? ? return response.expectedContentLength;
}
2、開啟異步線程,請求網絡下載文件:
/*
?下載文件
?*/
- (void)downloadFile:(NSString *)urlStr done:(void (^)())done{
? ??
? ? //1.獲取系統自帶全局隊列
? ? //并行隊列,多個線程并發執行:DISPATCH_QUEUE_PRIORITY_DEFAULT
? ? dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
? ??
? ? //2.異步執行
? ? dispatch_async(queue, ^{
? ? ? ? //創建url對象
? ? ? ? NSURL *url = [[NSURL alloc] initWithString:urlStr];
? ? ? ? NSLog(@"url: %@", urlStr);
? ? ? ??
? ? ? ? //獲取本地已下載文件大小
? ? ? ? long long localFileLen = [self getLocalFileLen];
? ? ? ? NSLog(@"localFileLen : %lld", localFileLen);
? ? ? ??
? ? ? ? //獲取網絡文件大小
? ? ? ? long long netFileLen = [self getNetFileLen:url];
? ? ? ? NSLog(@"netFileLen : %lld", netFileLen);
? ? ? ??
? ? ? ? if(localFileLen == netFileLen){//一樣表示存在了
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ??
? ? ? ? //每次從服務端獲取的文件數據大小
? ? ? ? long long itemSize = 1024 * 20;
? ? ? ??
? ? ? ? //一段數據的開始position位置
? ? ? ? long long startPos = 0;
? ? ? ??
? ? ? ? //一段數據的結尾position位置
? ? ? ? long long endPos = 0;
? ? ? ??
? ? ? ? while (startPos < netFileLen) {
? ? ? ? ? ? //計算結尾position
? ? ? ? ? ? endPos = startPos + itemSize - 1;
? ? ? ? ? ??
? ? ? ? ? ? //組裝range字段,用于請求頭
? ? ? ? ? ? NSString *range = [NSString stringWithFormat:@"Bytes=%lld-%lld", startPos, endPos];
? ? ? ? ? ??
? ? ? ? ? ? NSLog(@"range : %@", range);
? ? ? ? ? ??
? ? ? ? ? ? //重新計算下一段數據開始position
? ? ? ? ? ? startPos = startPos + itemSize;
? ? ? ? ? ??
? ? ? ? ? ? /*
? ? ? ? ? ? ?緩存策略
? ? ? ? ? ? ?NSURLRequestUseProtocolCachePolicy = 0, 默認,內存緩存
? ? ? ? ? ? ?NSURLRequestReloadIgnoringLocalCacheData = 1, 忽略本地內存緩存
? ? ? ? ? ? ?NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
? ? ? ? ? ? ?NSURLRequestReturnCacheDataElseLoad = 2,
? ? ? ? ? ? ?NSURLRequestReturnCacheDataDontLoad = 3,
? ? ? ? ? ? ?*/
? ? ? ? ? ??
? ? ? ? ? ? //(1)創建request
? ? ? ? ? ? NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
? ? ? ? ? ??
? ? ? ? ? ? //設置Range請求頭
? ? ? ? ? ? [request setValue:range forHTTPHeaderField:@"Range"];
? ? ? ? ? ??
? ? ? ? ? ? //(2)定義用于接收網絡信息的對象
? ? ? ? ? ? NSURLResponse *response = nil;
? ? ? ? ? ??
? ? ? ? ? ? //(3)同步請求網絡
? ? ? ? ? ? NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];
? ? ? ? ? ??
? ? ? ? ? ? //(4)將數據寫入文件
? ? ? ? ? ? [self appendFile:data];
? ? ? ? }
? ? ? ??
? ? ? ? //3.切回主線程
? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? //調用完成方法
? ? ? ? ? ? done();
? ? ? ? });
? ? ? ??
? ? });
}
3、獲取本地文件大?。?/strong>
/*
?獲取本地文件大小
?*/
- (long long)getLocalFileLen{
? ? //目錄路徑
? ? NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
? ? //文件路徑
? ? NSString *filePath = [cacheDir stringByAppendingPathComponent:@"qq.dmg"];
? ? //獲取本地文件NSDictionary信息
? ? NSDictionary *map = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL];
? ? //獲取本地文件大小,轉為longlong類型
? ? return [map[NSFileSize] longLongValue];
}
4、將NSData數據追加寫入文件:
/*
?將NSData數據追加寫入文件
?*/
- (void)appendFile:(NSData *)data{
? ? //目錄路徑
? ? NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
? ? //文件路徑
? ? NSString *filePath = [cacheDir stringByAppendingPathComponent:@"qq.dmg"];
? ??
? ? NSLog(@"filePath : %@", filePath);
? ??
? ? //創建文件操作類,NSFileHandle支持追加寫入方式
? ? NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:filePath];
? ??
? ? if(!file){//文件不存在時,直接覆蓋方式寫入
? ? ? ? [data writeToFile:filePath atomically:YES];
? ? ? ? return;
? ? }
? ? //跳到文件末尾
? ? [file seekToEndOfFile];
? ??
? ? //寫數據
? ? [file writeData:data];
? ??
? ? //關閉文件流
? ? [file closeFile];
}
原文鏈接:https://blog.csdn.net/a526001650a/article/details/89284161
相關推薦
- 2022-01-13 使用element插件中Descriptions遇到的坑
- 2021-10-24 Linux多線程中fork與互斥鎖過程示例_Linux
- 2022-11-13 使用git?checkout到歷史某個版本_相關技巧
- 2024-03-04 echarts 柱狀圖,單獨一根柱子根據條件改變顏色
- 2022-09-16 nginx緩存以及清除緩存的使用_nginx
- 2022-10-23 Android?AndFix熱修復原理詳情_Android
- 2022-05-28 C語言?超詳細講解庫函數_C 語言
- 2022-07-30 一文掌握Python正則表達式_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支