大文件斷點下載
(1)實現思路
在下載文件的時候不再是整塊的從頭開始下載,而是看當前文件已經下載到哪個地方,然后從該地方接著往后面下載。可以通過在請求對象中設置請求頭實現。
(2)解決方案(設置請求頭)
//2.創建請求對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//2.1 設置下載文件的某一部分
// 只要設置HTTP請求頭的Range屬性, 就可以實現從指定位置開始下載
/*
表示頭500個字節:Range: bytes=0-499
表示第二個500字節:Range: bytes=500-999
表示最后500個字節:Range: bytes=-500
表示500字節以后的范圍:Range: bytes=500-
*/
NSString *range = [NSString stringWithFormat:@"bytes=%zd-",self.currentLength];
[request setValue:range forHTTPHeaderField:@"Range"];
(3)注意點(下載進度并判斷是否需要重新創建文件)
//獲得當前要下載文件的總大小(通過響應頭得到)
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
//注意點:res.expectedContentLength獲得是本次請求要下載的文件的大小(并非是完整的文件的大小)
//因此:文件的總大小 == 本次要下載的文件大小+已經下載的文件的大小
self.totalLength = res.expectedContentLength + self.currentLength;
NSLog(@"----------------------------%zd",self.totalLength);
//0 判斷當前是否已經下載過,如果當前文件已經存在,那么直接返回
if (self.currentLength >0) {
return;
}
輸出流
(1)使用輸出流也可以實現和NSFileHandle相同的功能
(2)如何使用
//1.創建一個數據輸出流
/*
第一個參數:二進制的流數據要寫入到哪里
第二個參數:采用什么樣的方式寫入流數據,如果YES則表示追加,如果是NO則表示覆蓋
*/
NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:fullPath append:YES];
//只要調用了該方法就會往文件中寫數據
//如果文件不存在,那么會自動的創建一個
[stream open];
self.stream = stream;
//2.當接收到數據的時候寫數據
//使用輸出流寫數據
/*
第一個參數:要寫入的二進制數據
第二個參數:要寫入的數據的大小
*/
[self.stream write:data.bytes maxLength:data.length];
//3.當文件下載完畢的時候關閉輸出流
//關閉輸出流
[self.stream close];
self.stream = nil;