当前位置: 首页 > news >正文

iOS 设置下载部分文件,如何获取完整文件的大小

在视频的需求中,遇到这样一个需求,播放一视频的时候,要预下载
后面10条视频,但是只下载后面十条视频的前面1M

实现方法
1 创建请求时设置cacheLength

    resource = [[IdiotResource alloc] init];resource.requestURL = task.requestURL;resource.requestOffset = task.requestOffset;resource.fileLength = task.fileLength;resource.cachePath = task.cachePath;//预先下载1Mresource.cacheLength = 1024 * 1024;resource.resourceType = IdiotResourceTypeNet;//网络资源[self.resources addObject:resource];

二 创建请求时,设置 请求头的Range

- (void)fetchFromNetwork:(IdiotResource *)task withResource:(IdiotResource *)resource{NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[resource.requestURL originalSchemeURL] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];if (resource.cacheLength > 0) {[request addValue:[NSString stringWithFormat:@"bytes=%lld-%lld", MAX(resource.requestOffset, task.requestOffset + task.cacheLength), resource.requestOffset+resource.cacheLength-1] forHTTPHeaderField:@"Range"];}else{[request addValue:[NSString stringWithFormat:@"bytes=%lld-", resource.requestOffset] forHTTPHeaderField:@"Range"];}NSURLSessionDataTask * datatask = [self.session dataTaskWithRequest:request];datatask.taskDescription = [NSString stringWithFormat:@"%lld",task.requestOffset];[datatask resume];self.currentDataTask = datatask;
}

三 如何获取完整文件的大小

在 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
代理方法里面
通过获取响应头的 Content-Range 字段来获取,注意,不能通过
Content-Length来获取,因为这个时候Content-Length 是我们设置的请求部分的大小,不是完整的大小

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {IdiotResource * task = [self.taskDic objectForKey:dataTask.taskDescription];if (task.cancel) return;if (task.fileLength <= 0) {NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;NSString * contentRange = [[httpResponse allHeaderFields] objectForKey:@"Content-Range"];NSString * fileLength = [[contentRange componentsSeparatedByString:@"/"] lastObject];task.fileLength = fileLength.integerValue > 0 ? fileLength.integerValue : response.expectedContentLength;}if (self.currentResource.fileLength <= 0) {self.currentResource.fileLength = task.fileLength;}if (!task.cachePath.length) {task.cachePath = [IdiotFileManager createSliceWithUrl:task.requestURL sliceName:[NSString stringWithFormat:@"%lld-%lld",task.requestOffset,task.fileLength]];}if (self.currentResource.cacheLength <= 0) {self.currentResource.cacheLength = task.fileLength - task.requestOffset;}completionHandler(NSURLSessionResponseAllow);
}

如下图,所示
请添加图片描述

http://www.lryc.cn/news/152013.html

相关文章:

  • 如何助力金融贷款企业实现精准营销获客
  • html中的换行(\n)或回车(\r)符号不起作用的解决办法、br、white、space、pre、line
  • SpringBoot+MyBatisPlus+MySql+vue2+elementUi的案例、java访问数据库服务、java提供接口服务
  • 设计模式入门(二)观察者模式
  • 列化复杂的xml对应的类
  • 什么是软件开发生命周期(SDLC)?
  • 计算机视觉中常用的角点检测算法及其作用
  • css3英文文字换行,超过两行...展示
  • 查各种金属非金属材料的物性参数方法
  • 【数据库】查询PostgreSQL中所有表逻辑外键
  • 【Kubernetes理论篇】2023年最新CKA考题+解析
  • 【Linux】目录结构、路径
  • Java-集合框架-List,Set,Map,队列
  • 第一章_线程基础知识
  • linux(centos7)定时关机解决方案
  • reactnative笔记
  • 软件架构模式+系统架构
  • SQL 语句学习总结:
  • 【Linux】简单的小程序:进度条
  • Ansible之playbooks剧本
  • 在云原生时代,构建高效的大数据存储与分析平台
  • 第六章,线性变换,1-线性变换、表示矩阵、线性算子
  • 15个关于AI的Github库
  • 在Jupyter 中 from XXX import * 报错
  • 小程序密码显示与隐藏的实现
  • “亚马逊云科技创业加速器”首期聚焦AI,促进入营企业业务发展
  • 已解决“SyntaxError: invalid character in identifier“报错问题
  • 2023-09-02力扣每日一题
  • 服务war包部署SpringBootServletInitializer 的作用
  • [Linux]进程程序替换