您的位置:首页 > 理论基础 > 计算机网络

用AFNetworking实现断点续传,暂停,继续

2016-01-21 21:20 603 查看
//获取已下载的文件大小  

- (unsigned long long)fileSizeForPath:(NSString *)path {  

    signed long long fileSize = 0;  

    NSFileManager *fileManager = [NSFileManager new]; // default is not thread safe  

    if ([fileManager fileExistsAtPath:path]) {  

        NSError *error = nil;  

        NSDictionary *fileDict = [fileManager attributesOfItemAtPath:path error:&error];  

        if (!error && fileDict) {  

            fileSize = [fileDict fileSize];  

        }  

    }  

    return fileSize;  

}  

//开始下载  

- (void)startDownload {  

    NSString *downloadUrl = @"http://www.xxx.com/xxx.zip";  

    NSString *cacheDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];  

    NSString *downloadPath = [cacheDirectory stringByAppendingPathComponent:@"xxx.zip"];  

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:downloadUrl]];  

    //检查文件是否已经下载了一部分  

    unsigned long long downloadedBytes = 0;  

    if ([[NSFileManager defaultManager] fileExistsAtPath:downloadPath]) {  

    //获取已下载的文件长度  

        downloadedBytes = [self fileSizeForPath:downloadPath];  

        if (downloadedBytes > 0) {  

            NSMutableURLRequest *mutableURLRequest = [request mutableCopy];  

            NSString *requestRange = [NSString stringWithFormat:@"bytes=%llu-", downloadedBytes];  

            [mutableURLRequest setValue:requestRange forHTTPHeaderField:@"Range"];  

            request = mutableURLRequest;  

        }  

    }  

    //不使用缓存,避免断点续传出现问题  

    [[NSURLCache sharedURLCache] removeCachedResponseForRequest:request];  

    //下载请求  

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];  

    //下载路径  

    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:downloadPath append:YES];  

    //下载进度回调  

    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {  

        //下载进度  

        float progress = ((float)totalBytesRead + downloadedBytes) / (totalBytesExpectedToRead + downloadedBytes);  

    }];  

    //成功和失败回调  

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {  

              

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  

              

    }];  

    [operation start];  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息