【iOS开发-98】文件分段下载:@“HEAD“和[request setValue:range forHTTPHeaderField:@"Range"]

(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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值