断点续传的实现思路
1、先向服务器发送请求获取文件的信息,比如说文件的大小和名称
2、获取本地文件的信息和服务器文件进行比较,比较步骤如下
服务器文件的信息用以下形式来获取
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置请求行中的请求方式
request.HTTPMethod = @"head";
//响应头
NSURLResponse *response = nil;
//同步发送网络请求
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];
//取得服务器文件的大小
self.expectedContentLength = response.expectedContentLength;
//拼接保存文件的路径
self.filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:response.suggestedFilename];
判断本地文件是否存在,如果文件不存在就返回0,从开始的位置下载,怎么判断文件是否存在,我们用了一个文件管理类
NSFileManager *fileManager = [NSFileManager defaultManager];
//判断文件是否存在
if ([fileManager fileExistsAtPath:self.filePath])
{
}
取得本地文件的大小
NSDictionary *attrs = [fileManager attributesOfItemAtPath:self.filePath error:NULL];
fileSize=attrs.fileSize;
本地文件的和大小和服务器文件的大小进行比较
如果本地文件的大小和服务器文件的大小一样就返回-1表示下载完成
如果本地文件的大小小于服务器文件的大小就返回下载到的那个字节数,接着下载,通过监听下载请求我们会发现请求头中有这个内容,就表示下载的范围
Range:bytes=x-y 从x个字节下载到y个字节
Range:bytes=x- 从x个字节下到最后
Range:bytes=-y 从头下到第y个字节
我们需要在请求头中设置,self.currentFileSize表示下载到的字节数,我们发送的请求就应该是当前已经下载到的字节到结束的字节
[request setValue:[NSString stringWithFormat:@"bytes=%lld-",self.currentFileSize] forHTTPHeaderField:@"Range"];
如果本地的文件大小大于服务器的文件大小了,说明下载肯定出错了,所以要删除文件,我们让它也返回0,从开始的位置进行下载
[fileManager removeItemAtPath:self.filePath error:NULL];
整体过程就是用如下方法进行判断
- (long long)checkLocalFileInfo {
long long fileSize = 0;
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:self.filePath]) {
//如果文件存在,比较服务器文件大小
//本地文件的大小
NSDictionary *attrs = [fileManager attributesOfItemAtPath:self.filePath error:NULL];
fileSize = attrs.fileSize;
if (fileSize == self.expectedContentLength) {
fileSize = -1;
}
if (fileSize > self.expectedContentLength) {
//
fileSize = 0;
//删除文件
[fileManager removeItemAtPath:self.filePath error:NULL];
}
}
return fileSize;
}
如果要暂停下载会用到NSURLConnection对象中的一个方法,此处用self.connection来表示这个对象
[self.connection cancel];