HarmonyNext使用request.agent.download实现断点下载
filedownlaod(API12)
📚简介
filedownload 这是一款支持大文件断点下载的开源插件,退出应用程序进程杀掉以后或无网络情况下恢复网络后,可以在上次位置继续恢复下载等
版本更新—请查看更新日志!!! 修复已知bug,demo已经更新
📚下载安装
ohpm install @ohos_lib/filedownload
1、添加权限在应用主模块entry/src/main/ets/module.json5下
"requestPermissions": [{"name" : "ohos.permission.INTERNET"},{"name" : "ohos.permission.GET_NETWORK_INFO"},]
2、在应用主模块entry入口EntryAbility onCreate生命周期里下面添加初始化数据库操作
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');SqliteHelper.getInstance(this.context).initRDB();
}
3、在应用主模块entry入口Index.ts AboutToAppear()生命周期里添加如下代码
try {await DownloaderUtil.persistActiveDownloads();
}catch (e) {
}
4.首先确定服务器是否支持断点下载,否则通过request.agent.create无法实现断点下载
curl -I -H "Range: bytes=0-100" 下载路径
出现206 Partial Content 就代表着服务器支持断点续传与下载 —如下
yanruifeng@bogon video % curl -I -H "Range: bytes=0-100" https://dal-video.wenzaizhibo.com/a6dac8c6371a54477a5692f46ea9698e/6825c7da/00-x-upload/video/205971345_ae77bc38ae8b689a5a534e51b3153c8b_Kg3W8sai.mp4HTTP/1.1 206 Partial Content
filedownload相关 API
方法 | 介绍 |
---|---|
persistActiveDownloads() | 断点下载的主要方法「内置更改数据库状态,把断点前后字节数统一合并成一个文件」 |
static async pause(taskId: string):Promise | 下载暂停方法「内置更改数据库状态」 |
static async resume(downloadInfo: IFileDownloader):Promise | 下载恢复方法 「内置更改数据库状态」 |
static async delete(userId: string, downloadId: string):Promise | 删除「取消下载」方法「删除数据库表记录,删除文件系统下载文件、」 |
static async downloadFile(data: T, isBatchInsertQueue?: boolean) | 通用下载方法 |
GTNetworkUtil | 网络相关工具类 「监听有网、无网状态」 |
FileUtil | 文件操作相关工具类 「沙盒文件存储、删除等操作」 |
SqliteHelper | 数据库操作类、「增删改查」 |
static addListener(eventName:string,callback:(download:IFileDownloader)=>void) | 下载统一监听回调类「进度监听、失败、恢复、成功、暂停」 |
基本用法
import { IFileDownloader } from '@ohos_lib/filedownload/src/main/ets/interface/IFileDownloader';
import {DownloaderUtil,DownloadManager, NetworkCallback, SqliteHelper,GTNetworkUtil} from '@ohos_lib/filedownload'
import { DownloadStatus } from '@ohos_lib/filedownload/src/main/ets/constants/DownloadStatus';
import { relationalStore } from '@kit.ArkData';
import { promptAction, router } from '@kit.ArkUI';
import { IResponseData } from '../interfaces/IResponseData';@Entry
@ComponentV2
struct SingleFileDownload {@Local userId:string ='722134343434343434';//登录用户信息id 这里写四Mockprivate networkCallback:NetworkCallback={netAvailableCallback: (netHandle: ESObject) => {promptAction.showToast({message:'网络可用~'})},netLostCallback: (_: ESObject) => {promptAction.showToast({message:'网络连接已断开,请检查~'})//无网络情况下,恢复网络后继续保持在上次位置下载 --只需要调用如下一行代码即可// 本质逻辑内部还是发送了一个监听,统一在DownloadManager.addListener监听处理DownloaderUtil.persistActiveDownloads()}}@Local data: IResponseData[] = [];async aboutToAppear() {this.loadData();getContext().eventHub.on('reQuery',()=>{this.loadData();})DownloadManager.addListener(DownloadManager.eventName,(downloadInfo:IFileDownloader)=>{console.log('更新回调',downloadInfo.downloadSize)//进度监听更新回调let newData = this.data?.map((item)=>{if(item.downloadId===downloadInfo.downloadId){item.taskId = downloadInfo.taskId;item.filePath = downloadInfo.filePath;item.fileName =downloadInfo.fileName;item.downloadSize = downloadInfo.downloadSize;item.fileSize = downloadInfo.fileSize;item.isBackgroundPause =downloadInfo.isBackgroundPause;item.exitFrequency = downloadInfo.exitFrequency;item.status = downloadInfo.status;item.begins = downloadInfo.begins;return item;}return item;})this.data =newData;})//完善在无网络情况下,下载任务暂停,并且恢复网络后继续下载GTNetworkUtil.register(this.networkCallback)}//TODO tips: 下载失败,首先检查url是否可以正常访问,或者浏览器是否可以正常在线下载async loadData(){// TODO 假设从网络获取数据数据结构为: response=[{classNumber:'76432121445578293',className:'第一章 第一讲:At the Airport在机场'}]//转换数据结构response时接口类型必须要继承 extends IFileDownloader IFileDownloader接口类型初始化至少包含三个字段userId ,downloadId,url userId登录用户的userId//因此extends IFileDownloader过的IResponseData接口类型 对应转换后的数据如下所示let result:IResponseData[] =[{classNumber:'76432121445578293',downloadId:'76432121445578293',className:'第一章 第一讲:At the Airport在机场',"url": "http://dal-video.wenzaizhibo.com/13c7d34a1181dddad67cfbe387977842/6836c525/00-x-upload/video/209245033_3aaf16a38aff214594fffec92839d37e_n8kGbGC8.mp4", userId:this.userId}]//从数据库读取获取上次的下载进度let predicates =new relationalStore.RdbPredicates(SqliteHelper.tableName);predicates.equalTo('userId',this.userId);let queryList = await SqliteHelper.getInstance(getContext()).queryData(predicates);if(queryList.length>0){let newData = result.map((item:IResponseData)=>{let obj =queryList.find(el=>el.downloadId===item.downloadId);if(obj) {item.taskId = obj.taskId;item.filePath = obj.filePath;item.fileName =obj.fileName;item.downloadSize = obj.downloadSize;item.fileSize = obj.fileSize;item.isBackgroundPause =obj.isBackgroundPause;item.exitFrequency = obj.exitFrequency;item.status = obj.status;item.begins = obj.begins;return item;}return item;})this.data= newData;}else{this.data = result;}}aboutToDisappear(): void {GTNetworkUtil.unregister();DownloadManager.removeListener(DownloadManager.eventName)getContext().eventHub.off('reQuery');}getStatus(status:number|undefined){switch (status){case DownloadStatus.COMPLETED:return '下载完成'case DownloadStatus.PAUSE:return '暂停'case DownloadStatus.FAILED:return '下载失败'case DownloadStatus.RUNNING:return '下载中'default :return '下载'}}@Builder imageAnimator(item:IResponseData){ImageAnimator().images([{src: $r('app.media.ic_downloading_1')},{src: $r('app.media.ic_downloading_2')},{src: $r('app.media.ic_downloading_3')},{src: $r('app.media.ic_downloading_4')},{src: $r('app.media.ic_downloading_5')}]).duration(1000).state(item.status===DownloadStatus.RUNNING?AnimationStatus.Running:AnimationStatus.Initial).reverse(false).fillMode(FillMode.None).iterations(-1).width(24).height(24).onStart(() => {console.info('Start')}).onPause(() => {console.info('Pause')}).onRepeat(() => {console.info('Repeat')}).onCancel(() => {console.info('Cancel')}).onFinish(() => {console.info('Finish')})}build() {Column() {Stack({alignContent:Alignment.TopStart}){ForEach(this.data,(item:IResponseData)=>{Flex({direction:FlexDirection.Row,alignItems:ItemAlign.Center,justifyContent:FlexAlign.SpaceBetween}) {Row(){Text(item?.className).fontSize(16).fontWeight(FontWeight.Bold)}.layoutWeight(1)if(item.status===DownloadStatus.COMPLETED){Image($r('app.media.ic_download_completed')).width(24).height(24)}else if(item.status===DownloadStatus.RUNNING) {this.imageAnimator(item);}else if(item.status===DownloadStatus.FAILED){Image($r('app.media.ic_download_fail')).width(24).height(24)}else if(item.status===DownloadStatus.PAUSE){Image($r('app.media.ic_download_start')).width(24).height(24)}}.width('100%').height(44).onClick(async ()=>{if (item?.status === DownloadStatus.RUNNING) { //下载中---->点击触发取消下载【删除下载】let number = await DownloaderUtil.delete(item.userId,item.downloadId);if(number>0){this.loadData();}} else if (item?.status === DownloadStatus.FAILED) { //下载失败----> 重新下载DownloaderUtil.downloadFile(item);} else if (item?.status === DownloadStatus.PAUSE) { //下载暂停----->代表要恢复下载await DownloaderUtil.resume(item);} else if(item.status===DownloadStatus.COMPLETED) { //下载完成 ---->去播放router.pushUrl({url: 'pages/VideoPlayerPage',params:{url:'file:///'+item.filePath+'/'+item.fileName,}})}else{ //未下载 -->去下载promptAction.showToast({message:'开始下载',})DownloaderUtil.downloadFile(item);}}).padding({left: 16,right: 16}).margin({top: 32})})}.layoutWeight(1)Button('查看下载').type(ButtonType.Capsule).onClick(()=>{router.pushUrl({url:'pages/DownloadManagerPage',params:{data:this.data,userId:this.userId}})}).backgroundColor(Color.Red)}.height('100%').width('100%')}
}
运行Demo演示效果
- demo 运行 git clone https://github.com/yrjwcharm/ohos_library.git
- 切换分支 git checkout feature/ohos/fileDownload
下载观看Demo演示效果–退出应用程序杀掉进程后恢复下载
点击下载视频
下载观看Demo演示效果–无网络情况下恢复网络后继续保持下载
点击下载视频
鸿蒙技术交流QQ群:783867484
开源不易,希望您可以动一动小手点点小⭐⭐
👴希望大家如有好的需求踊跃提交,如有问题请前往github提交issue,空闲时间会扩充与修复优化
🌏开源协议
本项目基于 Apache License 2.0 ,在拷贝和借鉴代码时,请大家务必注明出处。
相关文章:
HarmonyNext使用request.agent.download实现断点下载
filedownlaod(API12) 📚简介 filedownload 这是一款支持大文件断点下载的开源插件,退出应用程序进程杀掉以后或无网络情况下恢复网络后,可以在上次位置继续恢复下载等 版本更新—请查看更新日志!!! 修复已知bug,demo已经更新 Ὅ…...
《重塑认知:Django MVT架构的多维剖析与实践》
MVT,即Model - View - Template,是Django框架独特的架构模式。它看似简单的三个字母,实则蕴含着深刻的设计哲学,如同古老智慧的密码,解开了Web应用开发的复杂谜题。 模型,是MVT架构中的数据核心࿰…...
JS入门——三种输入方式
JS入门——三种输入方式 一、方式一:直接在警告框弹出(window可以省略) <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script><!-- 方式一直接在警告框弹…...

源的企业级网络安全检测工具Prism X(棱镜X)
Prism X(棱镜X)是由yqcs团队自主研发的开源网络安全检测解决方案,专注于企业级风险自动化识别与漏洞智能探测。该工具采用轻量化架构与跨平台设计,全面兼容Windows、Linux及macOS操作系统,集成资产发现、指纹鉴别、弱口…...

基于FPGA的二叉决策树cart算法verilog实现,训练环节采用MATLAB仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) MATLAB训练结果 上述决策树判决条件: 分类的决策树1 if x21<17191.5 then node 2 elseif x21>17191…...
mac电脑安装nvm
方案一、常规安装 下载安装脚本:在终端中执行以下命令来下载并运行 NVM 的安装脚本3: bash curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.39.5/install.sh | bash配置环境变量:安装完成后,需要配置环境变量。如…...

权限分配不合理如何影响企业运营?
“我们明明只给了她CRM的查看权限,怎么客户数据被删了?” “新员工入职三天了,HR系统权限还没开通,流程完全卡住!” “上个月刚给项目经理配了财务权限,怎么又出乱子了?” 这些对话是否在你的…...

ES分词搜索
ES的使用 前言作者使用的版本作者需求 简介ES简略介绍ik分词器简介 使用es的直接简单使用es的查询 es在java中使用备注说明 前言 作者使用的版本 es: 7.17.27spring-boot-starter-data-elasticsearch: 7.14.2 作者需求 作者接到一个业务需求,我们系统有份数据被…...
深入掌握Node.js HTTP模块:从开始到放弃
文章目录 一、HTTP模块入门:从零搭建第一个服务器1.1 基础概念解析1.2 手把手创建服务器 二、核心功能深入解析2.1 处理不同请求类型2.2 实现文件下载功能 三、常见问题解决方案3.1 跨域问题处理3.2 防止服务崩溃3.3 调试技巧 四、安全最佳实践4.1 请求头安全设置4.…...

【数据库】并发控制
并发控制 在数据库系统,经常需要多个用户同时使用。同一时间并发的事务可达数百个,这就是并发引入的必要性。 常见的并发系统有三种: 串行事务执行(X),每个时刻只有一个事务运行,不能充分利用…...

Ansys Zemax | 手机镜头设计 - 第 2 部分:光机械封装
本文该系列文章将讨论智能手机镜头模组设计的挑战,涵盖了从概念、设计到制造和结构变形的分析。本文是四部分系列的第二部分,介绍了在 Ansys Speos 环境中编辑光学元件以及在整合机械组件后分析系统。案例研究对象是一家全球运营制造商的智能手机镜头系统…...
湖北理元理律师事务所债务优化实践:在还款与生活间寻找平衡支点
在个人债务规模持续扩大的社会背景下,如何科学管理债务正成为民生焦点。湖北理元理律师事务所通过其服务案例表明:债务优化的本质不是逃避责任,而是建立可持续的还款体系,让债务人保有基本生活尊严。 一、打破“越还越穷”的恶性…...

mcp-go v0.30.0重磅发布!Server端流式HTTP传输、OAuth支持及多项功能革新全面解读!
随着云原生应用和现代分布式系统需求的不断增长,高效、灵活且稳定的通信协议和客户端交互框架成为开发者关注的焦点。作为开源领域备受期待的项目之一,mcp-go再次迎来重要版本更新——v0.30.0正式发布!本次更新版本不仅实现了众多关键功能&am…...
解锁 MCP 中的 JSON-RPC:跨平台通信的奥秘
你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等希望看什么,评论或者私信告诉我! 文章目录 零、 背景一、RPC vs HTTP1.1 什么是RPC1.2 为什么需要 RPC?1.3 RPC 解决了什么…...
流复制(Streaming Replication)与自动故障转移(Failover)实战:用Patroni或Repmgr搭建生产级数据库集群
更多服务器知识,尽在hostol.com 嘿,各位PostgreSQL的“掌舵人”和数据“守护神”们!咱们都知道,PostgreSQL(简称PG)以其强大的功能、稳定性和开源的特性,赢得了越来越多开发者和企业的青睐。但…...

OpenGL Chan视频学习-10 Dealing with Errors in OpenGL
bilibili视频链接: 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站: docs.gl 说明: 1.之后就不再单独整理网站具体函数了,网站直接翻译会…...

美团启动618大促,线上消费节被即时零售传导到线下了?
首先,从市场推广与消费者吸引的角度来看,美团通过联合众多品牌开展大规模促销活动,并发放高额优惠券包,旨在吸引更多消费者参与购物。这种策略有助于提高平台的活跃度和交易量,同时也能够增强用户粘性。对于消费者而言…...

搭建 Select 三级联动架构-东方仙盟插件开发 JavaScript ——仙盟创梦IDE
三级级联开卡必要性 在 “东方仙盟” 相关插件开发中,使用原生 HTML 和 JavaScript 实现三级联动选择(如村庄 - 建筑 - 单元的选择)有以下好处和意义,学校管理: 对游戏体验的提升 增强交互性:玩家能够通…...

服务器如何配置防火墙管理端口访问?
配置服务器防火墙来管理端口访问,是保障云服务器安全的核心步骤。下面我将根据你使用的不同操作系统(Linux: Ubuntu/Debian/CentOS;Windows Server)介绍常用防火墙配置方法。 ✅ 一、Linux 防火墙配置(UFW / firewalld…...
Webhook入门
主要参考资料: 深入解析 Webhook:从原理到实践的全面指南: https://blog.csdn.net/weixin_43114209/article/details/144250750 目录 简介Webhook 与传统 API 调用的区别与轮询 (Polling) 的对比典型工作流程 简介 简单来说,Webhook 是一种“…...
LangChain整合Milvus向量数据库实战:数据新增与删除操作
导读:在AI应用开发中,向量数据库已成为处理大规模语义搜索和相似性匹配的核心组件。本文通过详实的代码示例,深入探讨LangChain框架与Milvus向量数据库的集成实践,为开发者提供生产级别的向量数据管理解决方案。 文章聚焦于向量数…...
LSTM+Transformer混合模型架构文档
LSTMTransformer混合模型架构文档 模型概述 本项目实现了一个LSTMTransformer混合模型,用于超临界机组协调控制系统的数据驱动建模。该模型结合了LSTM的时序建模能力和Transformer的自注意力机制,能够有效捕捉时间序列数据中的长期依赖关系和变量间的复…...
Symbol、Set 与 Map:新数据结构探秘
Symbol、Set 与 Map:新数据结构探秘 引言 ECMAScript 6 (ES6) 引入了三种强大的数据结构:Symbol、Set 与 Map,它们解决了 JavaScript 开发中的特定痛点,为我们提供了更多工具来处理复杂的数据操作。 Symbol:唯一标识…...

Spring Boot+Activiti7入坑指南初阶版
介绍 Activiti 是一个轻量级工作流程和业务流程管理 (BPM) 平台,面向业务人员、开发人员和系统管理员。其核心是一个超快且坚如磐石的 Java BPMN 2 流程引擎。它是开源的,并根据 Apache 许可证分发。Activiti 可以在任何 Java 应用程序、服务器、集群或云中运行。它与 Spri…...

如何在 Odoo 18 中创建 PDF 报告
如何在 Odoo 18 中创建 PDF 报告 Qweb 是 Odoo 强大的模板引擎,旨在轻松将 XML 数据转换为 HTML 文档。其功能特性包括基于属性的自定义、条件逻辑、动态内容插入及多样化的报告模板选项。这种多功能性使 Qweb 成为制作个性化、视觉吸引力强的报告、电子邮件和文档…...

【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用
【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用 文章目录 前言正文配置环境下载源码配置环境变量测试运行修改点说明实际运行情况 参考 前言 本文用来记录 xCoreSDK-Python的调用使用1。 正文 配置环境 配置开发环境,这里使用conda做python环境管理&…...
c/c++的opencv椒盐噪声
在 C/C 中实现椒盐噪声 椒盐噪声(Salt-and-Pepper Noise),也称为脉冲噪声(Impulse Noise),是数字图像中常见的一种噪声类型。它的特点是在图像中随机出现纯白色(盐)或纯黑色&#x…...
C++ TCP程序增加TLS加密认证
TCP为什么要增加TLS TCP程序添加TLS主要是为了解决TCP协议本身的安全缺陷。TCP作为传输层协议,虽然提供了可靠的数据传输,但它是明文传输,存在几个关键的安全问题: 数据泄露风险:TCP传输的数据完全暴露在网络中,任何能够监听网络流量的人都可以直接读取传输内容。这对于…...
构建一个“论文检索 + 推理”知识库服务,支持用户上传 PDF/LATEX 源码后,秒级检索并获得基于内容的问答、摘要、引用等功能
文章目录 1 总体目标 / Overall Goal2 数据管线 / Data Pipeline3 检索策略 / Retrieval Strategy4 服务切分 / Service Decomposition5 Agent & Prompt 设计 / Agent & Prompt6 核心功能 / Core Features7 评测与监控 / Evaluation & Monitoring8 面试亮点 / Inte…...

VLC-QT 网页播放RTSP
先看效果图,代码在文章末尾,包含源码,vlc-qt完整的库 环境说明:VS 2017 QTQt5.13.0 MSVC2017 32位 将vlc_install 目录下的bin,include,lib里所有的东西分别放在qt目录下 bin -> C:\Qt\Qt5.13.0\5.13.0\msvc2017\bin include->C:\Qt\Qt5.13.0\5.13.0\msvc201…...