撰写于 2012 年 11 月 6 日 | 转载自 : http://itjoy.org/?p=469
ASIHTTPRequest支持断点续传,断点续传的时候我们要设置一个临时容器来接收数据,当数据完全下载完毕的时候,文件将从临时文件夹移入到指定文件夹,自动删除临时文件夹中的内容。
代码实例:下载一首歌曲
//// - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //progress self.progressIndicator = [[[UIProgressView alloc]initWithFrame:CGRectMake(10, 80, 300, 10)]autorelease]; [self.view addSubview:self.progressIndicator]; ///startBtn UIButton *startBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; startBtn.frame = CGRectMake(20, 100, 100, 60); [startBtn setTitle:@"Start" forState:UIControlStateNormal]; [startBtn addTarget:self action:@selector(downloadStart:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:startBtn]; UIButton *pauseBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; pauseBtn.frame = CGRectMake(200, 100, 100, 60); [pauseBtn setTitle:@"Pause" forState:UIControlStateNormal]; [pauseBtn addTarget:self action:@selector(downloadPause:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:pauseBtn]; } - (void)downloadStart:(UIButton *)btn { ///创建请求 self.request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://zhangmenshiting.baidu.com/data2/music/35417538/13880429190800192.mp3?xcode=ead0f4d3b15d47b6273650a58d1b4b7f"]]; ///设置代理 self.request.delegate = self; //进度显示 self.request.downloadProgressDelegate = self.progressIndicator; ///另一种获取进度的方法,需要遵守ASIProgressDelegate协议 //self.request.downloadProgressDelegate = self; ///精确显示进度信息 self.request.showAccurateProgress = YES; //文件存储目录 NSString *savePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"safe&sound.mp3"]; NSLog(@"savePath=%@",savePath); ///文件临时目录 NSString *temp = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"temp"]; // NSString *tempPath = [temp stringByAppendingPathComponent:@"temp.mp3"]; NSLog(@"tempPaht=%@",tempPath); //如果临时目录不存在则创建 NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL fileExists = [fileManager fileExistsAtPath:tempPath]; if (!fileExists) { [fileManager createDirectoryAtPath:temp withIntermediateDirectories:YES attributes:nil error:nil]; } //设置存储目录 self.request.downloadDestinationPath = savePath; //设置临时目录 self.request.temporaryFileDownloadPath = tempPath; //允许断点续传 self.request.allowResumeForFileDownloads = YES; //下载完毕执行 self.request.didFinishSelector = @selector(FetchDataFinished:); //下载失败执行 self.request.didFailSelector = @selector(FetchDataFailed:); //下载信息上下文 self.request.userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"safe&sound",@"music", nil]; //开始异步下载 [self.request startAsynchronous]; } #pragma mark -- pause method - (void)downloadPause:(UIButton *)btn { [self.request clearDelegatesAndCancel]; } #pragma mark -- request delegate - (void)requestStarted:(ASIHTTPRequest *)request { NSLog(@"request start"); } - (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders { NSLog(@"receive responseHeader"); } //- (void)request:(ASIHTTPRequest *)request didReceiveBytes:(long long)bytes //{ //如果自己实现那个进度条,就遵守ASIProgressDelegate 实现此方法即可,获取大小,更新进度条 // NSLog(@"total=%lld",request.totalBytesRead); // NSLog(@"length=%lld",request.contentLength); //} #pragma mark -- finish & fail - (void)FetchDataFinished:(ASIHTTPRequest *)request { NSLog(@"finished"); NSLog(@"reqest.userinfo=%@",[request.userInfo objectForKey:@"music"]); } - (void)FetchDataFailed:(ASIHTTPRequest *)request { NSLog(@"failed"); NSLog(@"error=%@",[request.error localizedDescription]); }