文件下載基本步驟:
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];
}