(1)文件下载,一般的下载可以直接下载。而针对视频或者下载软件等下载需要分段下载。以下就是模拟的分段下载,即利用request设置Range,这个Range就是一个“bytes=1-1024”之类规定请求或者说下载的范围。
(2)利用NSFileHandle控制文件写入。
(3)只请求头文件HEAD,可以获取信息而不下载文件。
#import "ViewController.h"
#define kSizePerTime 50000
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imgView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url=[[NSBundle mainBundle]URLForResource:@"test.jpg" withExtension:nil];
//1、获取文件大小
long long fizeSize=[self fileSizeWithURL:url];
//比较本地是否有文件
long long localfile=[self localFileSize];
if (localfile==fizeSize) {
NSLog(@"文件已存在");
return;
}
//2、确定数据包大小
long long FromB=0;
long long ToB=0;
while (fizeSize>kSizePerTime) {
ToB=FromB+kSizePerTime-1;
//3、下载数据包
[self downloadWithURL:url FromB:FromB ToB:ToB];
fizeSize-=kSizePerTime;
FromB+=kSizePerTime;
}
ToB=FromB+fizeSize-1;
[self downloadWithURL:url FromB:FromB ToB:ToB];
NSString *path=[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"1.jpg"];
self.imgView.image=[UIImage imageWithContentsOfFile:path];
}
-(long long)fileSizeWithURL:(NSURL *)url{
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:2.0f];
request.HTTPMethod=@"HEAD";
NSURLResponse *response=nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];
return response.expectedContentLength;
}
-(long long)localFileSize{
NSString *path=[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"1.jpg"];
NSDictionary *dict=[[NSFileManager defaultManager]attributesOfItemAtPath:path error:NULL];
return [dict[NSFileSize] longLongValue];
}
-(void)downloadWithURL:(NSURL *)url FromB:(long long)FromB ToB:(long long)ToB{
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:2.0f];
NSString *range=[NSString stringWithFormat:@"Bytes=%lld-%lld",FromB,ToB];
[request setValue:range forHTTPHeaderField:@"Range"];
NSURLResponse *response=nil;
NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];
//写入文件
[self appendData:data];
NSLog(@"%@",response);
}
-(void)appendData:(NSData *)data{
NSString *path=[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"1.jpg"];
NSFileHandle *fh=[NSFileHandle fileHandleForWritingAtPath:path];
if (!fh) {
[data writeToFile:path atomically:YES];
}else{
[fh seekToEndOfFile];
[fh writeData:data];
[fh closeFile];
}
}
@end