斷點(diǎn)下載重點(diǎn)
- 利用HTTP請求頭的Range屬性佛猛,就可以實(shí)現(xiàn)從指定位置開始下載
- 表示頭500個字節(jié):Range: bytes=0-499
- 表示第二個500字節(jié):Range: bytes=500-999
- 表示最后500個字節(jié):Range: bytes=-500
- 表示500字節(jié)以后的范圍:Range: bytes=500-
- (IBAction)btnClick:(UIButton *)sender {
// 1.切換按鈕圖片
sender.selected = !sender.selected;
// 2.判斷是否是繼續(xù)下載
if (sender.selected) {
// 繼續(xù)下載
NSLog(@"繼續(xù)下載");
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 只要設(shè)置HTTP請求頭的Range屬性, 就可以實(shí)現(xiàn)從指定位置開始下載
/*
表示頭500個字節(jié):Range: bytes=0-499
表示第二個500字節(jié):Range: bytes=500-999
表示最后500個字節(jié):Range: bytes=-500
表示500字節(jié)以后的范圍:Range: bytes=500-
*/
NSString *range = [NSString stringWithFormat:@"bytes %zd-", self.currentLength];
[request setValue:range forHTTPHeaderField:@"Range"];
self.con = [NSURLConnection connectionWithRequest:request delegate:self];
}else
{
// 暫停
NSLog(@"暫停");
[self.con cancel];
}
}
大文件的下載
創(chuàng)建URL(NSURL)
-
創(chuàng)建請求(NSMutableURLRequest)
- 設(shè)置開始下載的位置
- 設(shè)置請求頭中Range的值
發(fā)送請求(NSURLConnection)并設(shè)置代理
實(shí)現(xiàn)NSURLConnectionDataDelegate代理方法
代理方法:
-
接收到服務(wù)器響應(yīng)的時候
- 可以獲取要下載文件的信息(大形竟尽)
- 判斷是否之前已經(jīng)下載的有一部分了,如果沒有就下載
- 創(chuàng)建一個空的文件勇于保存下載的數(shù)據(jù)(NSFileManager)
- 創(chuàng)建文件的路徑
-
接收到服務(wù)器返回的數(shù)據(jù)
- 創(chuàng)建一個操作文件的句柄(NSFileHandle)
- 通過句柄可以設(shè)置每次接收到的數(shù)據(jù)寫入的位置
[self.handle seekToEndOfFile];
- 利用句柄寫入數(shù)據(jù)
[self.handle writeData:data];
- 可計(jì)算出當(dāng)前接收到的數(shù)據(jù)的大小,得出下載比例
// 計(jì)算當(dāng)前接收到得數(shù)據(jù)的總數(shù) self.currentLength += data.length; // 計(jì)算下載比例 self.progressView.progress = 1.0 * self.currentLength/self.totalLength;
-
接收完畢
- 關(guān)閉句柄
- 清空指針
[self.handle closeFile]; self.handle = nil;
也可以接收到服務(wù)器響應(yīng)的時候創(chuàng)建一個文件流(NSOutputStream)
// 創(chuàng)建一個輸出流
/*
第一個參數(shù): 告訴系統(tǒng)數(shù)據(jù)流需要輸出到哪
第二個參數(shù): 告訴系統(tǒng)如何輸出, 如果傳遞YES, 代表著每次數(shù)據(jù)都是輸出到上一次的屁股后面
*/
self.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:YES];
// 只要調(diào)用open方法, 就可以往指定的文件中輸出數(shù)據(jù)
// 如果文件不存在就會自動創(chuàng)建一個
[self.outputStream open];
- 接收到服務(wù)器返回的數(shù)據(jù)的時候把數(shù)據(jù)寫入流
/*
第一個參數(shù): 傳入需要寫入的數(shù)據(jù)
第二個參數(shù): 告訴系統(tǒng)寫入的數(shù)據(jù)有多長
*/
[self.outputStream write:data.bytes maxLength:data.length];
[self.outstream close];
- 數(shù)據(jù)接收完畢后關(guān)閉流
[self.outputStream close];
self.outputStream = nil;