• AFNetWorking 断点续传时如何获取文件的长度


    方法一

    普通下载的情况,非Range方式请求的下载。
    通过AFNetWorking获取文件的长度,代码简写如下

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
    NSURL *URL = [NSURL URLWithString:self.model.remoteUrl];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
    
    [manager setDownloadTaskDidWriteDataBlock:^(NSURLSession * _Nonnull session, NSURLSessionDownloadTask * _Nonnull downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
    
    }];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    totalBytesExpectedToWrite即是想要的文件长度。但是这只是普通的获取文件的长度的方法,如果在请求的头文件中设置了Range,则该方法不起作用,该方法只返回设置Range的length。

    方法二

    通过头文件直接获取文件长度,遍访API没找到直接的获取文件真实长度的接口,既然没找到,那就手动获取吧。
    我们获取的heads中的range内容如下

    {contents = "bytes 0-10239/909216"}
    
    • 1

    数值909216既是我们想获得的文件的长度,单位为byte。如何获取呢?通过正则获取,写法如下

    // 从head中获取filesize
    - (NSInteger)getFileFromHead:(NSString *)contentRange {
    - 	NSInteger fileSize = 0;
        if (contentRange) {
            NSError *error = NULL;
            
            // 创建一个正则
            NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=/)[0-9]+$" options:NSRegularExpressionCaseInsensitive error:&error];
            //仅取出第一条匹配记录
            NSTextCheckingResult *firstResult = [regex firstMatchInString:contentRange options:0 range:NSMakeRange(0, [contentRange length])];
            if (firstResult) {
                fileSize = [[contentRange substringWithRange:firstResult.range] integerValue];
                
            }
        }
        return fileSize;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    我们在网络返回后就调用上面的正则函数获取文件长度,代码如下

    destination:^NSURL *(NSURL *targetPath, NSURLResponse *response)……
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
    	NSString *contentRange = [[(NSHTTPURLResponse *)response allHeaderFields] objectForKey:@"Content-Range"];
    	fileSize = [self getFileSizeFromHead:contentRange];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    fileSize既是我们想要的文件长度值。

  • 相关阅读:
    GraphQL(8):与数据库结合示例
    7个步骤详解AdaBoost 算法原理和构建流程
    Vue前端面试题
    springboot基于微信小程序的高校学生疫情在校封闭管理系统的设计与实现毕业设计源码240904
    mongodb Community 7 安装(linux)
    Git的下载安装和启动(win10)
    ps怎么把图片变清晰,自学ps软件photoshop2022,简单快速用ps让照片更清晰更有质感
    阿里云服务器购买之后设置密码、安全组、增加带宽、挂载云盘教程
    【uni-app从入门到实战】组件和样式学习
    Java之String之equals和intern区别
  • 原文地址:https://blog.csdn.net/zcl369369/article/details/126369876