李洪强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:@" --%@ ",kBOUNDARY];

        [mstr appendFormat:@"neme = %@,fileName = %@",name,key];

        [mstr appendFormat:@" "];

        [mstr appendFormat:@" "];

        //2

        [mdata appendData:data];

        //3

        

        

    }];

    //2 准备表单数据

    [params enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL * _Nonnull stop) {

        

        NSMutableString *mstr = [NSMutableString string];

        [mstr appendFormat:@" --%@ ",kBOUNDARY];

        [mstr appendFormat:@"neme = %@,fileName = %@",name,key];

        //[mstr appendFormat:@" "];

        [mstr appendFormat:@" "];

        [mstr appendFormat:@"%@ ",value];

        //2

        [mdata appendData:

         [mstr dataUsingEncoding:NSUTF8StringEncoding]];

        

        

    }];

    

    

    //3  结束标识

    NSString *end = [NSString stringWithFormat:@" --%@-- ",kBOUNDARY];

    [mdata appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];

    

    return mdata.copy;

}

 

 

 

 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

@end

原文地址:https://www.cnblogs.com/LiLihongqiang/p/5648517.html