iOS-AFNetworking實現斷點續傳功能
上一節說到利用系統原生的方法實現斷點續傳功能,這次我們說下當下最時尚的第三方網路請求庫AFNetworking,利用AFNet實現斷點續傳。其實原理是和NSURLSessionDataTask一樣的。因為我們都知道AFNet在3.0之後是封裝的NSURLSession,想知道AFNet3.0和2.0的區別的所以在方法實現上面幾本一樣。至於AFNet怎麼利用CocoaPod獲取請移步到這裡。
方法實現
1.宣告以下屬性變數
@property (nonatomic , strong) AFURLSessionManager *manager;
@property (nonatomic , strong ) NSURLSessionDataTask *downloadTask;
@property (nonatomic , assign) NSInteger currentLength;
@property (nonatomic , assign) NSInteger totalLength;
@property (nonatomic , strong) NSFileHandle *fileHandle;
2.懶載入manager和downloadTask
建立會話管理者
- (AFURLSessionManager *)manager {
if (!_manager) {
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
_manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
}
return _manager;
}
建立下載任務
- (NSURLSessionDataTask *)downloadTask {
if (!_downloadTask) {
// 1.建立下載URL
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];
// 2.建立request請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 設定HTTP請求頭中的Range
NSString *range = [NSString stringWithFormat:@"bytes=%zd-", self.currentLength];
[request setValue:range forHTTPHeaderField:@"Range"];
__weak typeof(self) weakSelf = self;
_downloadTask = [self.manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
// 下載完成回撥block
NSLog(@"完成");
// 清空長度
weakSelf.currentLength = 0;
weakSelf.totalLength = 0;
// 關閉fileHandle
[weakSelf.fileHandle closeFile];
weakSelf.fileHandle = nil;
}];
[self.manager setDataTaskDidReceiveResponseBlock:^NSURLSessionResponseDisposition(NSURLSession * _Nonnull session, NSURLSessionDataTask * _Nonnull dataTask, NSURLResponse * _Nonnull response) {
NSLog(@"啟動任務");
// 每次喚醒task的時候會回撥這個block
// 獲得下載檔案的總長度:請求下載的檔案長度 + 當前已經下載的檔案長度
weakSelf.totalLength = response.expectedContentLength + self.currentLength;
// 沙盒檔案路徑
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"xxxxx"];
//NSLog(@"File downloaded to: %@",path);
// 建立一個空的檔案到沙盒中
NSFileManager *manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:path]) {
// 如果沒有下載檔案的話,就建立一個檔案。如果有下載檔案的話,則不用重新建立(不然會覆蓋掉之前的檔案)
[manager createFileAtPath:path contents:nil attributes:nil];
}
// 建立檔案控制代碼
weakSelf.fileHandle = [NSFileHandle fileHandleForWritingAtPath:path];
// 允許處理伺服器的響應,才會繼續接收伺服器返回的資料
return NSURLSessionResponseAllow;
}];
[self.manager setDataTaskDidReceiveDataBlock:^(NSURLSession * _Nonnull session, NSURLSessionDataTask * _Nonnull dataTask, NSData * _Nonnull data) {
//NSLog(@"setDataTaskDidReceiveDataBlock");
// 一直回撥,直到下載完成
// 指定資料的寫入位置 -- 檔案內容的最後面
[weakSelf.fileHandle seekToEndOfFile];
// 向沙盒寫入資料
[weakSelf.fileHandle writeData:data];
// 拼接檔案總長度
weakSelf.currentLength += data.length;
// 獲取主執行緒,不然無法正確顯示進度。
NSOperationQueue* mainQueue = [NSOperationQueue mainQueue];
[mainQueue addOperationWithBlock:^{
// 下載進度
NSLog(@"當前下載進度:%.2f%%",100.0 * weakSelf.currentLength / weakSelf.totalLength);
}];
}];
}
return _downloadTask;
}
啟動任務
[self.downloadTask resume];
暫停任務
[self.downloadTask suspend];
self.downloadTask = nil;
到這裡AFNetworking斷點續傳就完成了,至於多工下載原理一樣的。
相關推薦
iOS-AFNetworking實現斷點續傳功能
上一節說到利用系統原生的方法實現斷點續傳功能,這次我們說下當下最時尚的第三方網路請求庫AFNetworking,利用AFNet實現斷點續傳。其實原理是和NSURLSessionDataTask一樣的。因為我們都知道AFNet在3.0之後是封裝的NSURLSess
iOS-NSURLSessionDataTask實現斷點續傳功能
平時專案開發中,經常遇到下載視訊、語音、圖片等等,其中斷點續傳是最常見的,當然這也是根據產品需求而定的,如果檔案很小,就用不到斷點,嗖地一下就下載好了。 斷點續傳可以用蘋果原生的方法,也可以用AFNetworking。 本節先講蘋果原生的檔案下載方法,這裡需
5.2 SpringBoot實現斷點續傳功能 > 我的程式猿之路:第四十二章
功能使用webuploader元件分片下載檔案 文件地址: http://fex.baidu.com/webuploader/document.html 從 http://fex.baidu.com/webuploader/download.html中下載 用到的是:
自己主動升級系統的設計與實現(續2) -- 添加斷點續傳功能 (附最新源代碼)
blog down 決定 top lin dom itl com 關於 一.緣起 之前已經寫了兩篇關於自己主動升級系統OAUS的設計與實現的文章(第一篇、第二篇)。在為OAUS服務端添加自己主動檢測文件變更的功能(這樣每次部署版本號升級時,能夠節省非常多時間。
WebUploader 實現大檔案的斷點續傳功能
斷點續傳指的是在下載或上傳時,將下載或上傳任務(一個檔案或一個壓縮包)人為的劃分為幾個部分,每一個部分採用一個片段進行上傳或下載,如果碰到網路故障,可以從已經上傳或下載的部分開始繼續上傳下載未完成的部分,而沒有必要從頭開始上傳下載。使用者可以節省
iOS實現斷點續傳
網路下載是我們在專案中經常要用到的功能,如果是小檔案的下載,比如圖片和文字之類的,我們可以直接請求源地址,然後一次下載完畢。但是如果是下載較大的音訊和視訊檔案,不可能一次下載完畢,使用者可能下載一段時間,關閉程式,回家接著下載。這個時候,就需要實現斷點續傳的功能。讓使用者可以隨時暫停下載,下次開始下
Java servlet 簡單實現http檔案下載斷點續傳功能
斷點續傳,聽上去似乎是個比較高階的話題,本文只講述一下http版的斷點續傳,其他協議的大家可以自行研究。 http協議中,服務端實現斷點續傳首先需要讀取客戶端傳送的Range頭資訊,比如“Range: bytes=12583394-”這個就是指原來正在下載的檔案需要從第12
Java實現的斷點續傳功能
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; impor
自動升級系統的設計與實現(續2) -- 增加斷點續傳功能 (附最新原始碼)
一.緣起 之前已經寫了兩篇關於自動升級系統OAUS的設計與實現的文章(第一篇、第二篇),在為OAUS服務端增加自動檢測檔案變更的功能(這樣每次部署版本升級時,可以節省很多時間,而且可以避免手動修改帶來的錯誤)後,有部分使用者又提出了一個很好的建議:為OAUS增加斷點續傳功能。因為如果網路狀態不是
檔案上傳那些事兒:多圖上傳、大檔案上傳、斷點續傳功能實現與分析
簡介 看了不少的教程,在系統整合搭建的過程中一般寫到檔案上傳這一節時,基本上實現一個檔案上傳功能就不再繼續拓展,而是就此截止轉而去講解其他的內容了,因為企業級應用開發中這些功能肯定會使用到,企業網站的檔案上傳不可能只有一個單圖上傳,也不可能不實現大檔案的功能處
IOS 下載檔案斷點續傳原理與實現(附原始碼)
在網路狀況不好的情況下,對於檔案的傳輸,我們希望能夠支援可以每次傳部分資料。首先從檔案傳輸協議FTP和TFTP開始分析, FTP是基於TCP的,一般情況下建立兩個連線,一個負責指令,一個負責資料;而TFTP是基於UDP的,由於UDP傳輸是不可靠的,雖然傳輸速度很快,但對於普通的檔案像PDF這種,少了一個
MongoDB全量遷移斷點續傳功能學習與實現
1. 背景 MongoDB是一個基於分散式檔案儲存的開源資料庫系統,使用者儲存文字資料。MongoDB提供了一個面向文件的儲存,操作起來比較簡單容易,查詢速度快等特點。資料遷移是資料庫工作中經常見到的一個場景,比如擴容、備份、上雲等需求,資料遷移包括全量遷移和增量遷
用AsyncTask實現斷點續傳
asynctask實現文件下載與斷點續傳 在學習四大組件之一的service時,正好可以利用asyncTask 和OKhttp來進行斷點續傳,並在手機的前臺顯示下載進度。 嘗試下載的是Oracle官網上的jdk1.7 在AS中使用OKhttp,只需要簡單的在app/build.grad
dropzone.js重寫斷點續傳功能
jsjs文件:var uploaddropzone = new Dropzone("#uploaddropzone",{ url: ctx + "/slider/fileUploadContinue", acceptedFiles: "", maxFiles: 1, autoDiscover
rsync 實現斷點續傳
direct pan 悲劇 文件 byte font scp命令 size receive Linux 主機之間即時傳送文件,scp命令大家都很熟悉但當要傳送的文件較大,過程中如果網絡中斷了,就比較悲劇了。這時候可以考慮使用rsync命令替代scp,實現斷點續傳文件。 試驗
用Java實現斷點續傳 (HTTP)
斷點續傳的原理 其實斷點續傳的原理很簡單,就是在 Http 的請求上和一般的下載有所不同而已。 打個比方,瀏覽器請求伺服器上的一個文時,所發出的請求如下: 假設伺服器域名為 www.sjtu.edu.cn,檔名為 down.zip。 GET /down.zip HTTP/1
【Flume】flume檔案監控的source元件開發,增量傳輸檔案內容,支援斷點續傳功能
基於flume-ng中原有exec的source型別,通過tail依賴於作業系統去監聽檔案內容變化,其次,不支援斷點續傳的功能,特此,自行開發了一個元件,大家可以看看,一起探討: 該元件特點如下: 1、一個source對應一個檔案監控 2、實時監控檔案變化 3、增量傳輸檔
java多執行緒實現斷點續傳下載
public class DownloadThread extends Thread {private int id;private int startindex;private int endindex;private String path;static int threadfinishedcount=0
Python實現斷點續傳下載檔案,大檔案下載還怕下載到一半就斷了嗎?不存在!
這篇部落格簡單介紹python斷點續傳下載檔案,並加入花哨的下載進度顯示方法,涉及Python檔案操作的技巧,和一些函式庫的使用。 環境 Python 3.6 requests模組 對應檔案的下載連結 (要下載的檔案必須支援斷點續傳) (是不是很少東西
簡單實現斷點續傳+MVP+Retrofit+RxJava
依賴: compile 'com.squareup.retrofit2:retrofit:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.s