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下载示例(支持断点续传)
一.创建网络请求队列 首先,创建网络请求队列,如下: ASINetworkQueue *que = [[ASINetworkQueue alloc] init]; self.netWorkQueu ...
- ASIHttpRequest:创建队列、下载请求、断点续传、解压缩
ps:本文转载自网络:http://ryan.easymorse.com/?p=12 感谢作者 工程完整代码下载地址:RequestTestDownload1 可完成: 下载指定链接的zip压缩文件 ...
- AFNetworking 3.0 断点续传 使用记录
最近项目中用到了压缩包下载,使用AFNetworking 3.0 下载压缩包 支持断点续传 代码如下: #import "HDInternet_handler.h" #import ...
- ASIHTTPRequest详解 [经典3]
大文件断点续传 0.94 以后支持大文件的断点下载,只需要设置: [ request setAllowResumeForFileDownloads:YES ]; [ request setDownlo ...
- ASIHTTPRequest详解 [经典]
ASIHTTPRequest 对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPR ...
- ASIHTTPRequest类库简介和使用说明
官方网站: http://allseeing-i.com/ASIHTTPRequest/ .可以从上面下载到最新源码,以及获取到相关的资料. 使用iOS SDK中的HTTP网络请求API,相当的复杂, ...
- iOS - ASIHTTPRequest 网络请求
前言 使用 iOS SDK 中的 HTTP 网络请求 API,相当的复杂,调用很繁琐,ASIHTTPRequest 就是一个对 CFNetwork API 进行了封装,并且使用起来非常简单的一套 AP ...
- AFNetworking、MKNetworkKit和ASIHTTPRequest对比
之前一直在使用ASIHTTPRequest作为网络库,但是由于其停止更新,iOS7上可能出现更多的问题,于是决定更换网络库. 目前比较流行的网络库主要有AFNetworking和MKNetworkKi ...
- ASIHTTPRequest详解
ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPRe ...
随机推荐
- laravel5.2总结--csrf保护
CSRF攻击: CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作.我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 S ...
- DEDE调用指定文章ID来调用特定文档
http://www.jb51.net/cms/137423.html 代码如下: {dede:arclist row=1 idlist='6'} <li><a href=" ...
- bash shell命令与监测的那点事(二)
bash shell命令与监测的那点事之top 上次我们说到了ps命令,ps命令虽然在收集运行在系统上的进程信息很有用,但是也有不足之处,ps命令只能显示某个特定时间点的信息,如果你想观察频繁换进换出 ...
- nyoj 题目6 喷水装置
喷水装置(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以 ...
- linux下telnet安装与使用
现在管理linux基本都用crt.xshell或者putty,已经没什么人用telnet,因为后续需要讲zabbix免客户端监控只telnet,通过telnet来监控服务器性能. yum安装telne ...
- 一些echarts的基本图形
先拿一个图形渲染过程举例 引用处 <bar ref="ARPUChart" v-if="ARPUChart" style="width:500p ...
- tmux使用备忘
创建新的session tmux 查看已有session tmux ls 进入tmux后 默认快捷键前缀为Ctrl+b,可以通过配置文件来修改 从session中断开 C-b d 给session改名 ...
- Linux 程序编译过程的来龙去脉
大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类 ...
- css中按钮的四种状态
css中按钮有四种状态 1. 普通状态2. hover 鼠标悬停状态3. active 点击状态4. focus 取得焦点状态 .btn:focus{outline:0;} 可以去除按钮或a标签点击后 ...
- shell总结
1. shell脚本的变量赋值 变量赋值语句中的等号左右不能有空格 即 a = 4 //错误 a=4 //正确 2. shell脚步的执行需要权限 chmod +x shell.sh ./shel ...