·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> 服务器文件下载

服务器文件下载

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

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