文件下載基本步驟:
1.獲取下載鏈接,創建響應發送請求.(使用異步請求,避免因文件過大下載時間長而阻塞主線程).
2.當接到響應時在下載目錄中創建文件.創建文件使用NSFileHandle進行文件內部處理.(檢驗文件是否存在——利用NSFileManager創建文件——NSFileHandle的fileHandleForWritingAtPath方法對文件進行寫入).
3.接收數據時,將分段接收的數據寫入文件中
4.文件接收完畢後,關閉NSFileHandle.
以上為普通下載步驟,此處不用代碼示范,以下以實現斷點下載功能為例.
因為沙盒路徑在本程序中經常使用,所以先提供一個獲取沙盒路徑方法
-(NSString *)getFilePath { NSString *document=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString *filePath=[document stringByAppendingPathComponent:_fileName]; return filePath; }
下載事件
- (IBAction)download:(UIButton *)sender { //獲取視頻地址URL NSString *string=@"http://221.228.249.8/2/b/k/h/o/bkhoxvtmbviswrdeddgvxcbufzwvwb/he.yinyuetai.com/631B014A6B0FCDF25944EB816345F6A6.flv"; //對地址按"/"分隔存入數組,獲取文件名稱 NSArray *array=[string componentsSeparatedByString:@"/"]; _fileName=[array lastObject]; //對url進行轉碼(當地址中存在漢子時無法無法識別,需將其轉換成符合要求的格式) string=[string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url=[NSURL URLWithString:string]; //可變響應,因為斷點下載再次發送請求的位置與之前不同 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; //判斷之前有沒有下載數據(沙盒中是否已存在) if([[NSFileManager defaultManager] fileExistsAtPath:[self getFilePath]])//之前已經下載 { //先獲取之前文件已經下載了多少 //字典保存文件的信息(由服務器反饋) NSDictionary *fileDic=[[NSFileManager defaultManager]attributesOfItemAtPath:[self getFilePath] error:nil]; NSLog(@"%@",fileDic); //獲取已接受的文件大小 _receiviceSize=[fileDic[NSFileSize]longLongValue]; //bytes = 0-499 請求前500個字節的內容 //bytes = 500- 請求500字節之後的內容 //bytes = 500-1000 請求資源中某一范圍的內容 //bytes = 0-1,499-500 請求多個范圍之間的內容 NSString *bytes=[NSString stringWithFormat:@"bytes=%lld-",_receiviceSize]; //設置請求頭的Range [request setValue:bytes forHTTPHeaderField:@"Range"]; } _connection=[NSURLConnection connectionWithRequest:request delegate:self]; }
暫停事件
- (IBAction)pause:(UIButton *)sender { //取消請求鏈接 [_connection cancel]; _connection=nil; }
#pragma mark ---NSURLConnectionDatasource---
//接到響應 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { //為了獲取response裡面的StatusCode狀態碼,將response強轉為NSHTTPURLResponse NSHTTPURLResponse *httpResponse=(NSHTTPURLResponse *)response; //剩余文件大小 NSDictionary *responseHead=httpResponse.allHeaderFields; //接收的文件+剩余文件=文件總大小 _totalSize=_receiviceSize+[responseHead[@"Content-Length"]longLongValue]; NSFileManager *manager=[NSFileManager defaultManager]; //如果沙盒中沒有該文件就創建文件 if ([manager fileExistsAtPath:[self getFilePath]]==NO) { [manager createFileAtPath:[self getFilePath] contents:nil attributes:nil]; } _fileHandle=[NSFileHandle fileHandleForWritingAtPath:[self getFilePath]]; } //接到數據 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { //將光標定位在文件末尾,每次在末位寫文件(默認是在文件頭部寫) [_fileHandle seekToEndOfFile]; [_fileHandle writeData:data]; //實時更新文件長度 _receiviceSize=_receiviceSize+data.length; } //接收完畢 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { [_fileHandle closeFile];
}