未完待续..

//

//  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的更多相关文章

  1. 李洪强iOS开发之添加手势

    李洪强iOS开发之添加手势 02 - 添加手势

  2. 李洪强iOS开发之- 实现简单的弹窗

     李洪强iOS开发之- 实现简单的弹窗 实现的效果:  112222222222223333333333333333

  3. 李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView

    李洪强iOS开发之后使用XIB实现横向滚动的UIScrollView 11111222

  4. 李洪强iOS开发之苹果使用预览截图

    李洪强iOS开发之苹果使用预览截图 01 在预览的图片中选中你要截得区域  02 - command + C   03 - Command + N 04 - Command + S (保存)

  5. 李洪强iOS开发之通知的使用

    李洪强iOS开发之通知的使用 01 - 在A中发送通知 02 - 在B中监听通知 03 - 在B中通知出发的方法 04 - 在B控制器viewDidLoad调用通知

  6. 李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView

    李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView (VTmagic是一个实现左右滚动的控制器的框架,也可以实现此功能) 实现的效果:  01 - 创建四个控制器 02 - 定义需要 ...

  7. 李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片

     李洪强iOS开发之 - 实现九宫格并使用SDWebImage下载图片  源码:  // //  ViewController.m //  08-九宫格扩展 // //  Created by 李洪强 ...

  8. 李洪强iOS开发之 - WebViewJavascriptBridge

    李洪强iOS开发之 - WebViewJavascriptBridge 01 - JS端:   02 - iOS端 01 遵守代理协议 02 申明属性 03 开启日志 04 给哪个webview建立J ...

  9. 李洪强iOS开发本人集成环信的经验总结_09_处理好友请求

    李洪强iOS开发本人集成环信的经验总结_09_处理好友请求 实现这种效果: 01 - 遵守处理好友请求的代理协议 02  - 设置代理 03 - 实现代理方法 04 - 实现代理中用到的方法 

随机推荐

  1. iOS学习之UI自定义cell

    一.自定义Cell 为什么需要自定义cell:系统提供的cell满足不了复杂的样式,因此:自定义Cell和自定义视图一样,自己创建一种符合我们需求的Cell并使用这个Cell.如下图所示的这些Cell ...

  2. OpenGL学习笔记之了解OpenGL

    OpenGL(全写Open GraphicsLibrary)是个定义了一个跨编程语言.跨平台的编程接口规格的专业的图形程序接口.它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库. 说 ...

  3. [shell基础]——awk命令

    关于awk awk是一个强大的文本分析工具,相对于grep的查找.sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大. 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开 ...

  4. 微软职位内部推荐-Senior Software Engineer

    微软近期Open的职位: Are you looking for a big challenge? Do you know why Big Data is the next frontier for ...

  5. 微软职位内部推荐-Sr SDE

    微软近期Open的职位: MSN reaches nearly half a billion people across the globe where we are the #1 portal in ...

  6. 20145120 《Java程序设计》第7周学习总结

    20145120 <Java程序设计>第7周学习总结 教材学习内容总结 Lambda表达式 例:Comparator<String> byLength = (name1, na ...

  7. IOS常用加密DES

    NSString+DES.h // // NSString+DES.h // haochang // // Created by Administrator on 14-4-15. // Copyri ...

  8. 对MVC的理解

    摘要:本文主要谈到了对PHP开发中MVC开发模式的理解. 当用户通过url触发命令时,例如url=http://control.blog.sina.com.cn/admin/article/artic ...

  9. HDU 5592 ZYB's Premutation

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5592 题意: http://bestcoder.hdu.edu.cn/contests/contes ...

  10. Android本地服务

    一.服务生命周期总结 (一).单独开启服务,并没有绑定服务Activity中调用startService(),服务的lifecycle:onCreate()→onStartCommand()→onSt ...