你好,歡迎來到IOS教程網

 Ios教程網 >> IOS使用技巧 >> IOS技巧綜合 >> 服務器文件下載

服務器文件下載

編輯:IOS技巧綜合
[摘要]本文是對服務器文件下載的講解,對學習IOS蘋果軟件開發有所幫助,與大家分享。

文件下載基本步驟:
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];
}
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved