http://blog.csdn.net/daiyelang/article/category/1377418

ASIHTTPRequest可以实现断点续传。网上有一些介绍类似使用:

 
[request setAllowResumeForFileDownloads:YES];
 
方法的。但是它不是真正意义的断点续传。它只能让应用在下载过程中,暂停和继续。如果退出应用再进入是无效的。
 
不过,通过ASIHTTPRequest的异步请求以及delegate还是可以实现断点续传的。
 
本文还是以Grails编写断点续传服务器端为例。
 
异步请求的代码:
 
 
 
-(void) doSimpleGetBinary{ 
    NSURL *url = [NSURL URLWithString:@"http://localhost:8080/BookProto/book/image"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setRequestMethod:@"GET"]; 
    //[request addRequestHeader:@"Range" value:@"bytes=3-"]; 
    [request setDelegate:self]; 
    
    [request startAsynchronous]; 
}
 
这里设置了Delegate, 要在头文件中实现相应的protocol:
 
@interface CFHttpDemoViewController : UIViewController<ASIProgressDelegate> {
 
本例中使用到了delegate的如下方法。
 
requestFinished:
 
- (void)requestFinished:(ASIHTTPRequest *)request{ 
    NSLog(@"response status code: %i",[request responseStatusCode]); 
    NSLog(@"response content length: %@",[[request responseHeaders] objectForKey:@"Content-Length" ]); 
    NSLog(@"request finished."); 
    label.text=@"request finished."; 
}
 
 
 
这个方法在异步请求结束后调用。
 
下面的方法,是当缓冲区接收到部分数据后调用,看起来是每间隔一定的毫秒,就调用一下,并传入缓冲区的NSData对象。
 
-(void)request:(ASIHTTPRequest *)request  didReceiveData:(NSData *)data{ 
    NSLog(@"did receive data, data length: %i",[data length]); 
    
    //复制到字节数组中 
    Byte *byteData=(Byte *)malloc([data length]); 
    memcpy(byteData,[data bytes],[data length]); 
    
    for (int i=0; i<=10; i++) { 
        NSLog(@"%i: %i",i+1,byteData[i]); 
    } 
    
    free(byteData); 
    
    [request cancel]; 
    label.text=@"canceled."; 
}
 
 
 
运行代码,屏蔽:
 
[request addRequestHeader:@"Range" value:@"bytes=3-"];
 
和取消屏蔽,数据分别如下:
 
2011-07-12 14:17:13.497 CFHttpDemo[2647:207] did receive data, data length: 10172 
2011-07-12 14:17:13.514 CFHttpDemo[2647:207] 1: 137 
2011-07-12 14:17:13.515 CFHttpDemo[2647:207] 2: 80 
2011-07-12 14:17:13.516 CFHttpDemo[2647:207] 3: 78 
2011-07-12 14:17:13.516 CFHttpDemo[2647:207] 4: 71 
2011-07-12 14:17:13.517 CFHttpDemo[2647:207] 5: 13 
2011-07-12 14:17:13.518 CFHttpDemo[2647:207] 6: 10 
2011-07-12 14:17:13.518 CFHttpDemo[2647:207] 7: 26 
2011-07-12 14:17:13.519 CFHttpDemo[2647:207] 8: 10 
2011-07-12 14:17:13.520 CFHttpDemo[2647:207] 9: 0 
2011-07-12 14:17:13.520 CFHttpDemo[2647:207] 10: 0 
2011-07-12 14:17:13.521 CFHttpDemo[2647:207] 11: 0 
2011-07-12 14:17:13.522 CFHttpDemo[2647:207] response status code: 200 
2011-07-12 14:17:13.523 CFHttpDemo[2647:207] response content length: 10172 
2011-07-12 14:17:13.523 CFHttpDemo[2647:207] request finished.
 
2011-07-12 14:02:24.551 CFHttpDemo[2578:207] did receive data, data length: 10169 
2011-07-12 14:02:24.553 CFHttpDemo[2578:207] byteData ok. 
2011-07-12 14:02:24.554 CFHttpDemo[2578:207] 1: 71 
2011-07-12 14:02:24.554 CFHttpDemo[2578:207] 2: 13 
2011-07-12 14:02:24.555 CFHttpDemo[2578:207] 3: 10 
2011-07-12 14:02:24.555 CFHttpDemo[2578:207] 4: 26 
2011-07-12 14:02:24.556 CFHttpDemo[2578:207] 5: 10 
2011-07-12 14:02:24.556 CFHttpDemo[2578:207] 6: 0 
2011-07-12 14:02:24.557 CFHttpDemo[2578:207] 7: 0 
2011-07-12 14:02:24.557 CFHttpDemo[2578:207] 8: 0 
2011-07-12 14:02:24.558 CFHttpDemo[2578:207] 9: 13 
2011-07-12 14:02:24.558 CFHttpDemo[2578:207] 10: 73 
2011-07-12 14:02:24.560 CFHttpDemo[2578:207] 11: 72 
2011-07-12 14:02:24.561 CFHttpDemo[2578:207] response status code: 206 
2011-07-12 14:02:24.561 CFHttpDemo[2578:207] response content length: 10169 
2011-07-12 14:02:24.562 CFHttpDemo[2578:207] request finished.
 
2.
 
NSUrlConnection实现断点续传的关键是自定义http request的头部的range域属性。
 
 Range头域
  Range头域可以请求实体的一个或者多个子范围。例如,
  表示头500个字节:bytes=0-499
  表示第二个500字节:bytes=500-999
  表示最后500个字节:bytes=-500
  表示500字节以后的范围:bytes=500-
  第一个和最后一个字节:bytes=0-0,-1
  同时指定几个范围:bytes=500-600,601-999
  但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。
 
在ios中使用NSMutableURLRequest来定义头部域
NSURL *url1=[NSURL URLWithString:@"下载地址";  
NSMutableURLRequest* request1=[NSMutableURLRequest requestWithURL:url1];  
[request1 setValue:@"bytes=20000-" forHTTPHeaderField:@"Range"];   
[request1 setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];  
NSData *returnData1 = [NSURLConnection sendSynchronousRequest:request1 returningResponse:nil error:nil];   
[self writeToFile:returnData1 fileName:@"SOMEPATH"];  
  
  
  
  
-(void)writeToFile:(NSData *)data fileName:(NSString *) fileName  
{  
    NSString *filePath=[NSString stringWithFormat:@"%@",fileName];  
    if([[NSFileManager defaultManager] fileExistsAtPath:filePath] == NO){  
        NSLog(@"file not exist,create it...");  
        [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];  
    }else {  
    NSLog(@"file exist!!!");  
    }  
  
    FILE *file = fopen([fileName UTF8String], [@"ab+" UTF8String]);  
  
    if(file != NULL){  
        fseek(file, 0, SEEK_END);  
    }  
    int readSize = [data length];  
    fwrite((const void *)[data bytes], readSize, 1, file);  
    fclose(file);  

ASIHTTPRequest实现断点续传的更多相关文章

  1. ASIHTTPRequest下载示例(支持断点续传)

    一.创建网络请求队列 首先,创建网络请求队列,如下: ASINetworkQueue   *que = [[ASINetworkQueue alloc] init]; self.netWorkQueu ...

  2. ASIHttpRequest:创建队列、下载请求、断点续传、解压缩

    ps:本文转载自网络:http://ryan.easymorse.com/?p=12 感谢作者 工程完整代码下载地址:RequestTestDownload1 可完成: 下载指定链接的zip压缩文件 ...

  3. AFNetworking 3.0 断点续传 使用记录

    最近项目中用到了压缩包下载,使用AFNetworking 3.0 下载压缩包 支持断点续传 代码如下: #import "HDInternet_handler.h" #import ...

  4. ASIHTTPRequest详解 [经典3]

    大文件断点续传 0.94 以后支持大文件的断点下载,只需要设置: [ request setAllowResumeForFileDownloads:YES ]; [ request setDownlo ...

  5. ASIHTTPRequest详解 [经典]

    ASIHTTPRequest 对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPR ...

  6. ASIHTTPRequest类库简介和使用说明

    官方网站: http://allseeing-i.com/ASIHTTPRequest/ .可以从上面下载到最新源码,以及获取到相关的资料. 使用iOS SDK中的HTTP网络请求API,相当的复杂, ...

  7. iOS - ASIHTTPRequest 网络请求

    前言 使用 iOS SDK 中的 HTTP 网络请求 API,相当的复杂,调用很繁琐,ASIHTTPRequest 就是一个对 CFNetwork API 进行了封装,并且使用起来非常简单的一套 AP ...

  8. AFNetworking、MKNetworkKit和ASIHTTPRequest对比

    之前一直在使用ASIHTTPRequest作为网络库,但是由于其停止更新,iOS7上可能出现更多的问题,于是决定更换网络库. 目前比较流行的网络库主要有AFNetworking和MKNetworkKi ...

  9. ASIHTTPRequest详解

    ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPRe ...

随机推荐

  1. loj2071 「JSOI2016」最佳团体

    分数规划+树形依赖背包orz #include <iostream> #include <cstring> #include <cstdio> #include & ...

  2. laravel5.2总结--文件上传

    1 配置 文件系统的配置文件在 config/filesystems.php 文件中,此处我们新建一个uploads本地磁盘空间用于存储上传的文件,具体配置项及说明如下: <?php retur ...

  3. IOS开发---菜鸟学习之路--(二十二)-近期感想以及我的IOS学习之路

    在不知不觉当中已经写了21篇内容 其实一开始是没有想些什么东西的 只是买了Air后 感觉用着挺舒服的,每天可以躺在床上,就一台笔记本,不用网线,不用电源,不用鼠标,不用键盘,干干脆脆的就一台笔记本. ...

  4. day05_07 标志位讲解

    continue: 需求:大于5才打印 for i in range(10): if i<6 : continue print(i) continue作用:结束本次循环,继续下次循环 break ...

  5. 【LeetCode】Merge Sorted Array(合并两个有序数组)

    这道题是LeetCode里的第88道题. 题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nu ...

  6. 【转】UGUI VS NGUI

    原文:http://gad.qq.com/college/articledetail/7191053 注[1]:该比较是基于15年-16年期间使用NGUI(3.8.0版本)与UGUI(4.6.9版本) ...

  7. 现代互联网的TCP拥塞控制(CC)算法评谈

    动机 写这篇文章本质上的动机是因为前天发了一个朋友圈,见最后的写在最后,但实际上,我早就想总结总结TCP拥塞控制算法点点滴滴了,上周总结了一张图,这周接着那些,写点文字. 前些天,Linux中国微信公 ...

  8. service中显示一个dialog

    dialog是依附于activity存在的.但是app中经常需要使用以下的情况,在service中做一些后台操作,在某个临界条件满足时,显示一个dialog告知用户.这时dialog无法直接从serv ...

  9. luogu 3406 海底高铁 前缀和

    题目链接 题意 给定一个数轴上的若干城市\(1,2,3,...,n\),在第\(i\)到\(i+1\)\((1\leq i\lt n)\)个城市间有铁路,通行方式可为 \(1.\)每次买票(花费\(a ...

  10. android基本控件学习-----TextView

    一.TextView的讲解 <实例一> <?xml version="1.0" encoding="utf-8"?> <Linea ...