ASIHTTPRequest-实现断点续传-1

翻译 2015年07月10日 15:07:53

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来定义头部域
  1. NSURL *url1=[NSURL URLWithString:@"下载地址";  
  2. NSMutableURLRequest* request1=[NSMutableURLRequest requestWithURL:url1];  
  3. [request1 setValue:@"bytes=20000-" forHTTPHeaderField:@"Range"];   
  4. [request1 setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];  
  5. NSData *returnData1 = [NSURLConnection sendSynchronousRequest:request1 returningResponse:nil error:nil];   
  6. [self writeToFile:returnData1 fileName:@"SOMEPATH"];  
  7.   
  8.   
  9.   
  10.   
  11. -(void)writeToFile:(NSData *)data fileName:(NSString *) fileName  
  12. {  
  13.     NSString *filePath=[NSString stringWithFormat:@"%@",fileName];  
  14.     if([[NSFileManager defaultManager] fileExistsAtPath:filePath] == NO){  
  15.         NSLog(@"file not exist,create it...");  
  16.         [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];  
  17.     }else {  
  18.     NSLog(@"file exist!!!");  
  19.     }  
  20.   
  21.     FILE *file = fopen([fileName UTF8String], [@"ab+" UTF8String]);  
  22.   
  23.     if(file != NULL){  
  24.         fseek(file, 0, SEEK_END);  
  25.     }  
  26.     int readSize = [data length];  
  27.     fwrite((const void *)[data bytes], readSize, 1, file);  
  28.     fclose(file);  
  29. }  

ASIHTTPRequest-实现断点续传-2

主要问题 需要请求Http协议,下载一个zip包。包比较大,希望能后台下载。退出应用再次打开的时候能接着上一次的下载。专业名称:断点续传。 寻找方案 iOS目前三大开源网络库 ...
  • yuanchunzi
  • yuanchunzi
  • 2015年07月10日 15:09
  • 196

ASIHTTPRequest-断点续传

ASIHTTPRequest-断点续传(下载)   2011-11-22 13:01:14|  分类: iphone |举报 |字号 订阅 从0.94版本开始,...
  • zhouleizhao
  • zhouleizhao
  • 2014年05月08日 15:14
  • 345

ASIHTTPRequest-断点续传(下载)

从0.94版本开始,ASIHTTPRequest可以恢复中断的下载 - (IBAction)resumeInterruptedDownload:(id)sender { NSURL *url =...
  • andy_jiangbin
  • andy_jiangbin
  • 2013年09月27日 22:08
  • 439

Java断点续传实现原理很简单

原理解析在开发当中,“断点续传”这种功能很实用和常见,听上去也是比较有“逼格”的感觉。所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网络上也能找到不少关于实现类似功能的资料...
  • ghost_Programmer
  • ghost_Programmer
  • 2016年07月16日 12:59
  • 6200

Android 断点续传下载功能实现

主要实现文件下载的暂停和继续下载功能。 用到的知识点: 1、Service的使用以及Service与Activity之间的数据交互; 2、SQLite数据库的简单使用; 3、文件下载与存储; ...
  • c19344881x
  • c19344881x
  • 2015年05月19日 16:22
  • 873

nginx断点续传

有些时候客户端可能只需要请求nginx服务器上的部分数据, 例如: 我们在看电影时, 常常拖动快进条,跳到指定的位置开始观看。 这其实是nginx的断点续传功能, 从指定位置开始观看,相当于向ngin...
  • ApeLife
  • ApeLife
  • 2017年06月23日 00:32
  • 2797

实现断点续传的两种思路

.在7月份分别做了多线程下载和断点续传 ,但当时只是测试,用了大文件分块传输的方法 实现流程首次传输其流程如下1.服务端向客户端传递文件名称和文件长度2.跟据文件长度计算文件块数3.客户端将传输的块数...
  • chinafe
  • chinafe
  • 2007年10月09日 14:38
  • 2801

实现断点续传的两种思路

2007年10月14日 13:30:00在7月份分别做了多线程下载和断点续传 ,但当时只是测试,用了大文件分块传输的方法 实现流程首次传输其流程如下1.服务端向客户端传递文件名称和文件长度2.跟据文件...
  • jackson031
  • jackson031
  • 2008年01月13日 22:34
  • 279

Java编写的断点续传的一个Demo示例

最近在研究Java的网络编程。在学习了基础知识和原理之后,觉得可以搞一个断点续传的Demo示例。分享记录一下。 涉及到的Java知识点:URL,HttpURLConnection,RandomAcce...
  • frankingly
  • frankingly
  • 2016年07月04日 16:08
  • 4542

Java 实现断点续传 (HTTP)

公司需要用Java做断点续传的实现,没有接触过,不过根据自己的理解就是文件接着上次传输的继续完成传输,具体的操作看到IBM这位仁兄的例子确实帮了大忙了,感谢! 原文地址:http://www.ibm....
  • boonya
  • boonya
  • 2013年12月17日 23:04
  • 2949
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASIHTTPRequest-实现断点续传-1
举报原因:
原因补充:

(最多只允许输入30个字)