李洪强iOS开发之断点续传1
未完待续..
//
// ViewController.m
// A18 - duo wen jian shang chuan
//
// Created by 李洪强 on 16/6/29.
// Copyright © 2016年 李洪强. All rights reserved.
//
#import "ViewController.h"
// 断点续传
// 1 获取服务器上文件的大小
//发送head请求(
//发送同步请求){
// //获取文件的大小
//
// //获取文件名(保存文件的时候使用)拼本地路径
// (从网络上获取的数据都放到caches目录)获取沙盒目录
//}
//
// 2 获取服务器文件的信息
//[self getSeverFileINfo:url];
// 获取本地文件的信息
//
//3 - (long long)获取本地文件的大小{
// //本地文件存在 返回0
// //判断本地文件是否存在,如果本地不存在,返回0
// long long filesize = 0;
// if(本地文件存在){
// //获取文件大小
// 输出字典(字典中有大小)
//
// }
//
//}
获取服务器文件的信息.拼接了保存到本地文件的路径
调用获取服务器文件的信息的方法
调用获取本地文件的信息的方法
设置请求头告诉服务器从filesize这个位置开始下载
/**
* 从指定位置开始下载
*
* @param url
* @param offset
*/
- (void)download:(NSURL *)url offset:(long long)offset{
//range: bytes = x-y 从x个字节下载到y个字节
//range:bytes = x- 从x个字节下载,下载到最后
//range:从开始位置下载,下到x字节
}
当拿到文件的大小之后给self.currentLen = filesize
判断(本地文件大小 == 服务器大小){
NSLog(@"文件已经下载");
return 0;
}
- ()获取服务器上文件的大小{
获取文件的大小
记录文件的大小
获取文件名,拼本地路径
}
获取本地文件的信息
-(long long) 获取本地文件的大小{
判断本地文件是否存在,如果文件不存在,返回0
long long fileSize = 0;
//如果文件存在
if(文件存在){
//获取文件的大小
用字典来接收
NSDictionary *dic = ...(拿到所有属性的方法)
}
//判断本地文件 > 服务器文件大小
if(){
//删除文件
//..
fileSize = 0
}
return 0;
}
//--------------------------------------
//总结:
//
// 做断点续传的时候,要发送head请求
// 下载大文件的时候,特别耗时,需要有一个进度提示
//用代理: NSURLConnectiondataDalegate
//下载完响应头执行的方法,我们就可以拿到文件的大小
//
//保存文件:有进度提示了,但是内存会暴涨
//解决内存暴涨: 下一点,保存一点
//NSFileHandle 文件的地址,对文件进行读写操作
//流
//
//
//断点续传实现的过程:
//
//文件下载了一半,把当前下载的位置记录下来
消息循环: 等待用户的事件
事件源: 用户输入的事件 timer
消息循环的模式->必须和事件源指定
NSDefaultRunLoopMode
NSRunLoopCommonModes
模式必须匹配才会被执行
当你拖动的时候,模式编程了,UIEVentTracking模式
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//准备地址
NSString *strURl = [NSString stringWithFormat:@""];
//准备文件
//字典里有文件的名字
NSString *fileName = @"oo.png";
NSString *path1 = [[NSBundle mainBundle]pathForResource:fileName ofType:nil];
NSData *data = [NSData dataWithContentsOfFile:path1];
//--
NSString *fileName2 = @"oo2.png";
NSString *path2 = [[NSBundle mainBundle]pathForResource:fileName ofType:nil];
NSData *data2 = [NSData dataWithContentsOfFile:path2];
//把数据放进字典
NSDictionary *files = @{fileName:data,fileName2:data2};
NSDictionary *params = @{@"username":@"zhoujielun"};
[self upLoadFiles:strURl files:files name:@"userfile[]" params:params];
}
//strUrl 上传图片的地址
//files 数组来存多个文件
//name input标签的name 只有一个
// fileNames 多个文件的名字
//
//- (void)upLoadFiles:(NSString *)strUrl fileDatas:(NSArray *)fileDatas name:(NSString *)name fileNames :(NSArray *)fileNames{
//
//}
//文件的名字作为键
//文件的NSData 作为值
//---->简化一下
//除了上传文件还要提交其他的信息
//上传多个文件
#define kBOUNDARY @"aaabbcc"
- (void)upLoadFiles:(NSString *)strUrl files:(NSDictionary *)files name:(NSString *)name params: (NSDictionary *)params{
NSURL *url = [NSURL URLWithString:strUrl];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:15];
request.HTTPMethod = @"post";
//设置请求头
NSString *ct = [NSString stringWithFormat:@"=%@",kBOUNDARY];
[request setValue:ct forHTTPHeaderField:@"Content-type"];
//设置请求体
//调用
request.HTTPBody = [self makeBody:files name:name params:params];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if (!connectionError) {
NSHTTPURLResponse *response = (NSHTTPURLResponse *)response;
//判断服务器是否有错
if(response.statusCode == 200){
NSString *html = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",html);
NSLog(@"成功");
}else{
NSLog(@"服务器错误");
}
}else{
NSLog(@"%@",connectionError);
}
}];
}
- (NSData *)makeBody:(NSDictionary *)files name:(NSString *)name params: (NSDictionary *)params{
NSMutableData *mdata = [NSMutableData data];
NSMutableString *mstr = [NSMutableString string];
//准备文件
//对files进行遍历
//键和值我都需要
//循环遍历
// 1 文件
[files enumerateKeysAndObjectsUsingBlock:^(NSString *key,NSData *data, BOOL * _Nonnull stop) {
//1
NSMutableString *mstr = [NSMutableString string];
[mstr appendFormat:@"\r\n--%@\r\n",kBOUNDARY];
[mstr appendFormat:@"neme = %@,fileName = %@",name,key];
[mstr appendFormat:@"\r\n"];
[mstr appendFormat:@"\r\n"];
//2
[mdata appendData:data];
//3
}];
//2 准备表单数据
[params enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL * _Nonnull stop) {
NSMutableString *mstr = [NSMutableString string];
[mstr appendFormat:@"\r\n--%@\r\n",kBOUNDARY];
[mstr appendFormat:@"neme = %@,fileName = %@",name,key];
//[mstr appendFormat:@"\r\n"];
[mstr appendFormat:@"\r\n"];
[mstr appendFormat:@"%@\r\n",value];
//2
[mdata appendData:
[mstr dataUsingEncoding:NSUTF8StringEncoding]];
}];
//3 结束标识
NSString *end = [NSString stringWithFormat:@"\r\n--%@--\r\n",kBOUNDARY];
[mdata appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
return mdata.copy;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
李洪强iOS开发之断点续传1的更多相关文章
- 李洪强iOS开发之添加手势
李洪强iOS开发之添加手势 02 - 添加手势
- 李洪强iOS开发之- 实现简单的弹窗
李洪强iOS开发之- 实现简单的弹窗 实现的效果: 112222222222223333333333333333
- 李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView
李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView 11111222
- 李洪强iOS开发之苹果使用预览截图
李洪强iOS开发之苹果使用预览截图 01 在预览的图片中选中你要截得区域 02 - command + C 03 - Command + N 04 - Command + S (保存)
- 李洪强iOS开发之通知的使用
李洪强iOS开发之通知的使用 01 - 在A中发送通知 02 - 在B中监听通知 03 - 在B中通知出发的方法 04 - 在B控制器viewDidLoad调用通知
- 李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView
李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView (VTmagic是一个实现左右滚动的控制器的框架,也可以实现此功能) 实现的效果: 01 - 创建四个控制器 02 - 定义需要 ...
- 李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片
李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片 源码: // // ViewController.m // 08-九宫格扩展 // // Created by 李洪强 ...
- 李洪强iOS开发之 - WebViewJavascriptBridge
李洪强iOS开发之 - WebViewJavascriptBridge 01 - JS端: 02 - iOS端 01 遵守代理协议 02 申明属性 03 开启日志 04 给哪个webview建立J ...
- 李洪强iOS开发本人集成环信的经验总结_09_处理好友请求
李洪强iOS开发本人集成环信的经验总结_09_处理好友请求 实现这种效果: 01 - 遵守处理好友请求的代理协议 02 - 设置代理 03 - 实现代理方法 04 - 实现代理中用到的方法
随机推荐
- TFS(Taobao File System)安装方法
文章目录: 一.TFS(Taobao File System)安装方法 二.TFS(Taobao File System)配置dataServer.分区.挂载数据盘 三.TFS(Taobao File ...
- [转]tftp在put上传的时候显示File not found的解决办法
[转]tftp在put上传的时候显示File not found的解决办法 http://blog.163.com/pengcz%40126/blog/static/35908607201182433 ...
- php捕获网络页面
<?php $url = 'http://jwzx.cqupt.edu.cn/pubYxKebiao.php?type=zy&yx=06'; $html = file_get_conte ...
- java提高篇-----详解java的四舍五入与保留位
转载:http://blog.csdn.net/chenssy/article/details/12719811 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么 ...
- android不要标题栏
去除标题栏title其实非常简单,他有两种方法,一种是在代码中添加,另一种是在AndroidManifest.xml中添加: 1.在代码中实现: 在此方法setContentView(R.layout ...
- 一个Option请求引发的深度解析
在当前项目中,前端通过POST方式访问后端的REST接口时,发现两条请求记录,一条请求的Request Method为Options,另一条请求的Reuest Method为Post.想要解决这个疑惑 ...
- 结队开发项目—NABC模型
特点:可以避免食堂的用餐高峰,从而使使用者节约时间 need:很多学生中午下课在食堂吃饭会遭遇用餐高峰,使用这款软件,可以提前订饭,按时送达,从而避免食堂的用餐高峰期. approach:学生可以提前 ...
- 主元分析PCA理论分析及应用
首先,必须说明的是,这篇文章是完完全全复制百度文库当中的一篇文章.本人之前对PCA比较好奇,在看到这篇文章之后发现其对PCA的描述非常详细,因此迫不及待要跟大家分享一下,希望同样对PCA比较困惑的朋友 ...
- ansii、unicode、utf8 区别和关系
本地化过程中涉及到源文件和目标文件的传输问题,这时候编码就显得很重要.中文的网页和操作系统中通常采用ANSI编码,这也是微软OS的一个字符标准.对于ANSI,不同的国家和地区制定了不同的标准,由此产生 ...
- ios 流媒体 资料
(1)“Real-Time Streaming Protocol (RTSP)”比较官方的资料(链接). (2)“ffmpeg”在百度百科的简介(链接). (3)“ffmpeg”的官网:http:// ...