斷點下載

斷點下載重點

  • 利用HTTP請求頭的Range屬性,就可以實現(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屬性, 就可以實現(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è)置代理

  • 實現(xiàn)NSURLConnectionDataDelegate代理方法

  • 代理方法:

  • 接收到服務(wù)器響應(yīng)的時候

    • 可以獲取要下載文件的信息(大?。?/li>
    • 判斷是否之前已經(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];
    
    • 可計算出當前接收到的數(shù)據(jù)的大小,得出下載比例
    // 計算當前接收到得數(shù)據(jù)的總數(shù)
    self.currentLength += data.length;
    
    // 計算下載比例
    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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容