文件下載基本步驟:
1.獲取下載鏈接,創(chuàng)建響應(yīng)發(fā)送請求.(使用異步請求,避免因文件過大下載時(shí)間長而阻塞主線程).
2.當(dāng)接到響應(yīng)時(shí)在下載目錄中創(chuàng)建文件.創(chuàng)建文件使用NSFileHandle進(jìn)行文件內(nèi)部處理.(檢驗(yàn)文件是否存在——利用NSFileManager創(chuàng)建文件——NSFileHandle的fileHandleForWritingAtPath方法對文件進(jìn)行寫入).
3.接收數(shù)據(jù)時(shí),將分段接收的數(shù)據(jù)寫入文件中
4.文件接收完畢后,關(guān)閉NSFileHandle.
以上為普通下載步驟,此處不用代碼示范,以下以實(shí)現(xiàn)斷點(diǎn)下載功能為例.
因?yàn)樯澈新窂皆诒境绦蛑薪?jīng)常使用,所以先提供一個(gè)獲取沙盒路徑方法
-(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"; //對地址按"/"分隔存入數(shù)組,獲取文件名稱 NSArray *array=[string componentsSeparatedByString:@"/"]; _fileName=[array lastObject]; //對url進(jìn)行轉(zhuǎn)碼(當(dāng)?shù)刂分写嬖跐h子時(shí)無法無法識別,需將其轉(zhuǎn)換成符合要求的格式) string=[string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url=[NSURL URLWithString:string]; //可變響應(yīng),因?yàn)閿帱c(diǎn)下載再次發(fā)送請求的位置與之前不同 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; //判斷之前有沒有下載數(shù)據(jù)(沙盒中是否已存在) if([[NSFileManager defaultManager] fileExistsAtPath:[self getFilePath]])//之前已經(jīng)下載 { //先獲取之前文件已經(jīng)下載了多少 //字典保存文件的信息(由服務(wù)器反饋) NSDictionary *fileDic=[[NSFileManager defaultManager]attributesOfItemAtPath:[self getFilePath] error:nil]; NSLog(@"%@",fileDic); //獲取已接受的文件大小 _receiviceSize=[fileDic[NSFileSize]longLongValue]; //bytes = 0-499 請求前500個(gè)字節(jié)的內(nèi)容 //bytes = 500- 請求500字節(jié)之后的內(nèi)容 //bytes = 500-1000 請求資源中某一范圍的內(nèi)容 //bytes = 0-1,499-500 請求多個(gè)范圍之間的內(nèi)容 NSString *bytes=[NSString stringWithFormat:@"bytes=%lld-",_receiviceSize]; //設(shè)置請求頭的Range [request setValue:bytes forHTTPHeaderField:@"Range"]; } _connection=[NSURLConnection connectionWithRequest:request delegate:self];}
暫停事件
- (IBAction)pause:(UIButton *)sender { //取消請求鏈接 [_connection cancel]; _connection=nil;}
#PRagma mark ---NSURLConnectionDatasource---
//接到響應(yīng)-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ //為了獲取response里面的StatusCode狀態(tài)碼,將response強(qiáng)轉(zhuǎn)為NSHTTPURLResponse NSHTTPURLResponse *httpResponse=(NSHTTPURLResponse *)response; //剩余文件大小 NSDictionary *responseHead=httpResponse.allHeaderFields; //接收的文件+剩余文件=文件總大小 _totalSize=_receiviceSize+[responseHead[@"Content-Length"]longLongValue]; NSFileManager *manager=[NSFileManager defaultManager]; //如果沙盒中沒有該文件就創(chuàng)建文件 if ([manager fileExistsAtPath:[self getFilePath]]==NO) { [manager createFileAtPath:[self getFilePath] contents:nil attributes:nil]; } _fileHandle=[NSFileHandle fileHandleForWritingAtPath:[self getFilePath]];}//接到數(shù)據(jù)-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ //將光標(biāo)定位在文件末尾,每次在末位寫文件(默認(rèn)是在文件頭部寫) [_fileHandle seekToEndOfFile]; [_fileHandle writeData:data]; //實(shí)時(shí)更新文件長度 _receiviceSize=_receiviceSize+data.length; }//接收完畢-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ [_fileHandle closeFile];
}
新聞熱點(diǎn)
疑難解答
圖片精選