• 李洪强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

  • 相关阅读:
    操作mysql的指令
    linux下安装mongodb
    linux将指令加入开机启动或加入环境变量
    php请求远程url内容方法
    nosql基本了解
    堆排序的实现
    转:导出csv文件数字会自动变科学计数法的解决方法
    jQuery筛选结果等于true的筛选
    转:Jquery的parent和parents(找到某一特定的祖先元素)
    drupal7 带表达式条件的update
  • 原文地址:https://www.cnblogs.com/LiLihongqiang/p/5648517.html
Copyright © 2020-2023  润新知