iOS进阶_WebDav(五.WebDav的上传进度&多线程下载思路)

WebDav的上传进度

#import "ViewController.h"

@interface ViewController ()<NSURLSessionTaskDelegate>
/** 会话  */
@property(nonatomic,strong)NSURLSession * session;
@end

@implementation ViewController

-(NSURLSession *)session
{
    if (!_session) {
        NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }
    return _session;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self putUpload]; 
}

#pragma mark - <上传演练>
-(void)putUpload{
    //1.url - URL是直接保存在服务器上的文件名
    NSURL * url = [NSURL URLWithString:@"http://192.168.31.180/uploads/123.wmv"];
    //2.请求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    //设置请求方法-webdav上传需要使用put方法
    request.HTTPMethod = @"PUT";
    //设置身份验证的数据
    NSString * authStr = [self base64Encode:@"admin:123456"];
    authStr = [@"BASIC " stringByAppendingString:authStr];
    //设置请求头
    [request setValue:authStr forHTTPHeaderField:@"Authorization"];

    //3.session
    //上传的源文件的路径!!
    NSURL * fileUrl = [[NSBundle mainBundle] URLForResource:@"abc.wmv" withExtension:nil];
    // 上传任务如果跟进进度,可以同时使用代码块Blcok的方式
    [[self.session uploadTaskWithRequest:request fromFile:fileUrl completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

        NSLog(@"%@ %@",str,response);

    }] resume];
}

#pragma mark - <代理>

/**
 参数:
 session
 task

 bytesSent                  本次发送的字节数
 totalBytesSent             已经发送的字节数
 totalBytesExpectedToSend   总字节数(文件总大小)
 */
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
{
    float progress = (float)totalBytesSent / totalBytesExpectedToSend;
    NSLog(@"%f %@",progress,[NSThread currentThread]);
}

多线程下载思路

无论是上传还是下载默认都是在单线程中的
例如面试中会被问道:如何实现多线程下载(注意:多线程不是指子线程!)

多线程下载同一个文件的实现思路

1.获取服务器上的文件大小
2.在本地创建一个相同大小的文件,所有字节都是0(注意:写入文件不能使用输出流NSOutputStream,而是需要使用NSFileHande)
3.开启多条线程(假设开启两条线程)

这里写图片描述

两条线程分别拿Rang bytes0-4,和Rang bytes5-8的数据

这里写图片描述

当其中一条线程拿到数据后,Rang bytes会逐渐缩减
这里写图片描述

写入文件的时候,使用的是NSFileHande,根据seekOffset依次顺序写入
1、记录每一条线程当前的offset
2、如果要支持多线程下载且断点续传,就需要建立一个plist/json保存每一条线程末次执行的offset

注意:其实在实际开发中,移动端不适合多线程下载,因为消耗资源大,会出现耗电快,手机发烫现象。

那能否支持多线程上传文件呢?

答案是不能!服务器不可能为了一个特殊的用户开启多线线程,提交只能顺序提交

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用webdav3.client模块中的Client类来下载文件。首先,需要创建一个Client对象,并设置好连接地址、用户名和密码等参数。然后,使用client.download()方法来进行文件下载操作。以下是一个示例代码: ```python from webdav3.client import Client def download(): options = { 'webdav_hostname': "webdav连接地址", 'webdav_login': "用户名", 'webdav_password': "密码", 'disable_check': True, } client = Client(options) remote_path = "/demo_app/2.txt" # 要下载的文件在webdav中的路径 local_path = "本地保存路径" # 下载后保存的本地路径 client.download(remote_path, local_path) print("下载完成") if __name__ == '__main__': print("开始下载...") download() ``` 在上述代码中,需要将"webdav连接地址"、"用户名"、"密码"和"本地保存路径"替换为实际的值。下载的文件将被保存到指定的本地路径中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python连接webdav](https://blog.csdn.net/godnightshao/article/details/126350885)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python、webdav 上传文件到坚果云](https://blog.csdn.net/weixin_43117763/article/details/115079630)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值