文件下载
来源:互联网 发布:时代网络大厦 美食 编辑:程序博客网 时间:2024/05/21 19:49
小文件下载方式:原因是它们有一个致命的缺点就是必须下载完成后才能返还给nsdata,也就是说无法监测到下载进度,实用性差,也就只能用于一些小文件的下载。
1.NSData dataWithContentsOfURL
2.NSURLConnection
//.NSData dataWithContentsOfURL
- (void)downloadFile{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 其实这就是一个GET请求
NSURL *url = [NSURL URLWithString:@”http://localhost:8080/MJServer/resources/images/minion_01.png“];
NSData *data = [NSData dataWithContentsOfURL:url];
NSLog(@”%d”, data.length);
});
}
//NSURLConnection
- (void)downloadFile2{
NSURL *url = [NSURL URLWithString:@”http://localhost:8080/MJServer/resources/images/minion_01.png“];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@”%d”, data.length);
}];
}
大文件下载方式:
大文件下载方式1:(由于内存问题不可取,但需要了解)
- (void)download{
// 1.URL
NSURL *url = [NSURL URLWithString:@”http://localhost:8080/MJServer/resources/videos.zip“];
// 2.请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 3.下载(创建完conn对象后,会自动发起一个异步请求)
[NSURLConnection connectionWithRequest:request delegate:self];
// [[NSURLConnection alloc] initWithRequest:request delegate:self];
// [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
// NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];//为NO 表示只是连接并没有立马开始请求,所以与 [conn start];套用
// [conn start];
}
- (void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event{
[self download];
} - (void)connection:(NSURLConnection )connection didFailWithError:(NSError )error{
NSLog(@”didFailWithError”);
}- 1.接收到服务器的响应就会调用
- (void)connection:(NSURLConnection )connection didReceiveResponse:(NSURLResponse )response{
NSLog(@”didReceiveResponse”);
// 初始化数据
self.fileData = [NSMutableData data];
// 取出文件的总长度方式1:
// NSHTTPURLResponse resp = (NSHTTPURLResponse )response;
// long long fileLength = [resp.allHeaderFields[@”Content-Length”] longLongValue];
// 取出文件的总长度方式2:
self.totalLength = response.expectedContentLength;
}
/**
* 2.当接收到服务器返回的实体数据时调用(具体内容,这个方法可能会被调用多次)
- (void)connection:(NSURLConnection )connection didReceiveData:(NSData )data{
// 拼接数据
[self.fileData appendData:data];
// 设置进度值
// 0 ~ 1
// self.progressView.progress = (double)self.fileData.length / self.totalLength;
self.circleView.progress = (double)self.fileData.length / self.totalLength;
}
- 3.加载完毕后调用(服务器的数据已经完全返回后)
*/- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@”connectionDidFinishLoading”);
// 拼接文件路径
NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *file = [cache stringByAppendingPathComponent:@”videos.zip”];
// 写到沙盒中
[self.fileData writeToFile:file atomically:YES];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
大文件下载方式2:
// 用来写数据的文件句柄对象
@property (nonatomic, strong) NSFileHandle *writeHandle;
// 文件的总大小
@property (nonatomic, assign) long long totalLength;
// 当前已经写入的文件大小
@property (nonatomic, assign) long long currentLength;
- (void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event{
// 1.URL
NSURL *url = [NSURL URLWithString:@”http://localhost:8080/MJServer/resources/music.zip“];
// 2.请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 3.下载(创建完conn对象后,会自动发起一个异步请求)
[NSURLConnection connectionWithRequest:request delegate:self];
}
// 1.接收到服务器的响应就会调用- (void)connection:(NSURLConnection )connection didReceiveResponse:(NSURLResponse )response{
// 文件路径
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *filepath = [caches stringByAppendingPathComponent:@”videos.zip”];
// 创建一个空的文件 到 沙盒中
NSFileManager *mgr = [NSFileManager defaultManager];
[mgr createFileAtPath:filepath contents:nil attributes:nil];
// 创建一个用来写数据的文件句柄
self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath];
// 获得文件的总大小
self.totalLength = response.expectedContentLength;
}
// 2.当接收到服务器返回的实体数据时调用(具体内容,这个方法可能会被调用多次) - (void)connection:(NSURLConnection )connection didReceiveData:(NSData )data{
// 移动到文件的最后面
[self.writeHandle seekToEndOfFile];
// 将数据写入沙盒
[self.writeHandle writeData:data];
// 累计文件的长度
self.currentLength += data.length;
NSLog(@”下载进度:%f”, (double)self.currentLength/ self.totalLength);
self.circleView.progress = (double)self.currentLength/ self.totalLength;
}
// 3.加载完毕后调用(服务器的数据已经完全返回后) - (void)connectionDidFinishLoading:(NSURLConnection *)connection{
self.currentLength = 0;
self.totalLength = 0;
// 关闭文件
[self.writeHandle closeFile];
self.writeHandle = nil;
}
- (void)connection:(NSURLConnection )connection didReceiveResponse:(NSURLResponse )response{
- 下载图片,下载文件
- 文件下载
- 文件下载
- 文件下载
- 文件下载
- 文件下载
- 文件下载
- 下载文件
- 文件下载
- 下载文件
- 文件下载
- 文件下载
- 下载文件
- 文件下载
- 下载文件
- 下载文件
- 文件下载
- 下载文件
- nginx配置location
- socket第三方库 AsyncSocket(GCDAsyncSocket)
- Maven 的安装下载和eclipse的整合
- error LNK2019: 无法解析的外部符号 (解决方法)
- jquery 合并单元格
- 文件下载
- printf函数缓冲区问题
- 考考你的C语言
- Postman工具
- iOS 搜索框
- 分区表的导入导出 expdp&impdp Oracle 11.2.0.4
- SQL 查尋(分组/group by/count/sum/avg/max/min/null/having/top/over) 排序(rwo_number/rank/dense_raenk/ntile)
- 原码, 反码, 补码 详解
- sql server 解决union all之后 order by失效的问题