网络通信中关于请求数据、断点续传和写入本地文件

- (void)viewDidLoad {

[super viewDidLoad];

NSLog(@"%@",NSHomeDirectory());

//取得已下载数据大小

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

receiveTotal = [[userDefaults objectForKey:@"ReceiveTotal"] doubleValue];

total = [[userDefaults objectForKey:@"Total"] doubleValue];

//显示上一次下载的进度

if (total > 0) {

CGFloat progress = receiveTotal/total;

self.progressView.progress = progress;

self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress * 100];

}

}

- (IBAction)downLoadClick:(UIButton *)sender {

if (!isDownLoad) {

//1.构建URL

NSURL *url = [NSURL URLWithString:@"http://s.qdcdn.com/lovebizhi/LoveWallpaper4Mac.dmg"];

//2.构建Request

NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url];

//断点续传

if (receiveTotal > 0) {

//设置续传位置

NSString *position = [NSString stringWithFormat:@"bytes=%d-",(int)receiveTotal];

[mRequest setValue:position forHTTPHeaderField:@"Range"];

}

//3.发送异步请求

connection = [NSURLConnection connectionWithRequest:mRequest delegate:self];

isDownLoad = YES;

//获取字符串

NSString *urlStr = url.absoluteString;

//获取urlStr的最后一部分

NSString *fileName = [urlStr lastPathComponent];

//写入文件

filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@",fileName];

//创建文件

[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];

}

}

//暂停下载

- (IBAction)pauseClick:(UIButton *)sender {

//取消下载连接

[connection cancel];

connection = nil;

//将缓冲数据写入文件

[self appendFileData:self.receiveData];

//在本地保存已下载文件的大小和文件总大小

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

[userDefaults setObject:@(receiveTotal) forKey:@"ReceiveTotal"];

[userDefaults setObject:@(total) forKey:@"Total"];

//将数据同步写入文件

[userDefaults synchronize];

isDownLoad = NO;

}

#pragma mark-NSURLConnectionDataDelegate

//服务器响应

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response{

self.receiveData = [[NSMutableData alloc]init];

//判断总大小是否为0,如果为0,说明从起始位置开始下,获取文件总大小

if (total == 0) {

//获取所有的响应头

NSDictionary *fields = response.allHeaderFields;

NSLog(@"fields is %@",fields);

//获取数据的总大小

NSNumber *length = [fields objectForKey:@"Content-Length"];

total = [length doubleValue];

NSLog(@"total is %.2f",total);

}

}

//接收数据

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

[self.receiveData appendData:data];

receiveTotal += data.length;

//计算进度

double progress = receiveTotal / total;

//刷新UI

self.progressView.progress = progress;

self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%",progress * 100];

//判断缓冲的数据是否大于500KB

if (self.receiveData.length >= 500 * 1024) {

//写入数据

[self appendFileData:self.receiveData];

//清空

self.receiveData.data = nil;

}

}

//数据传输完成

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

//将最后一个缓冲文件写入

if (self.receiveData.length < 500 * 1024) {

//写入数据

[self appendFileData:self.receiveData];

//清空

self.receiveData.data = nil;

}

_progressLabel.text = @"下载完成";

self.progressView.progress = 0;

isDownLoad = NO;

}

- (void)appendFileData:(NSData *)data{

if (data.length == 0) {

return;

}

//使用NSFileHandle写文件,此文件必须已经创建,NSFileHandle不会创建文件

NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];

//将数据插入到写入点

[fileHandle seekToEndOfFile];

[fileHandle writeData:data];

//关闭文件,确保写入完成

[fileHandle closeFile];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

时间: 2024-11-08 14:45:49

网络通信中关于请求数据、断点续传和写入本地文件的相关文章

jQuery 中 ajax 请求数据应用的一个小demo

举一个jquery中ajax的应用小 demo 便于以后的更多项目拓展 ,这里要注意的是保存的文件名和文件图片路径问题 ... ajax01.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> ajax小例子 </title> </head> <body> <!--

接口测试中读取excel中的请求数据含有中文问题,UnicodeEncodeError: &#39;latin-1&#39; codec can&#39;t encode character &#39;\u5c0f&#39; in position

错误信息:UnicodeEncodeError: 'latin-1' codec can't encode character '\u5c0f' in position 31: Body ('小') is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8的错误 原因:从excel中读取你的接口请求数据时带有中文时在发送求情时会出现上述错误.只需要将请求数据转化为bytes类型即可

在asp.net core的项目中通过log4net添加日志记录到本地文件

=============================================== 2020/2/25_第1次修改                       ccb_warlock =============================================== 由于之前的时间都忙于项目的业务开发,对于log4net的使用一直是“拿来主义”,仅仅用在了调试时输出到控制台看结果,而没有深究配置文件的参数和具体的机制. 正巧这段时间项目进度没有那么紧张,我也有时间来完善框

字符串,字典,数组写入本地文件和从本地文件读取

参考:http://blog.csdn.net/hakusan/article/details/39429393?utm_source=tuicool&utm_medium=referral 一.字符串,字典,数组存储到本地文件 字符串,数组,字典存储到本地文件过程一样,只是要存储的数据类型不同而已,这里以字符串存储到本地文件为例,如下:    NSString *content = @"将字符串存储到本地文件";    (1)获取Documents文件夹路径 参数:(1)指定

android中网络请求数据,解析并添加到Listview中

今天我实现了网络请求数据,解析并将数据添加到Listview中.上个星期我有提到说要实现点击Listview中item实现不同的功能,还是没头绪.如有幸被阅读,希望指教一下.我用的是hTTPClient的post方法请求的数据.在实现请求之前,还有一个主activity跳转.代码如下: 请求activity代码: public class MachineInterface extends Activity { private ListView machineType; private Array

struts中的请求数据自动封装

Struts 2框架会将表单的参数以同名的方式设置给对应Action的属性中.该工作主要是由Parameters拦截器做的.而该拦截器中已经自动的实现了String到基本数据类型之间的转换工作.在struts中,默认使用拦截器 <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> 进行请求数据自动封装,它会JSP中提交的

python web开发-flask中访问请求数据request

Request对象在web应用的开发中是一个非常重要的对象,主要用来获取用户发来的请求数据. 常用属性参考:http://docs.jinkan.org/docs/flask/api.html#flask.request 下面我们以一个表单提交的例子来说明一些常用request属性的使用. 1. 创建一个表单的template 在templates文件夹下面创建form.html模板文件,输入下面的代码 {% extends "base.html" %} {% import "

数据持久化,简单对象写入本地,复杂对象写入本地

#import "MainViewController.h" #import "Student.h" @interface MainViewController () @end @implementation MainViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     self = [super initWithNi

【iOS开发问题】使用NSCoding写入本地文件读取不出来或者文件没有写入本地

今天写私人通讯录的时候,找了半天文件写入位置, ]详细位置参考 http://blog.csdn.net/ttf1993/article/details/45154349 找到位置后我发现联系人没有写入本地 后来找到原因因为下面这句代码 NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject]; // 2.2.获得文件的全路径