HarmonyOS:基于axios实现文件的下载以及下载进度的监听

#前言:项目开发中,避免不了实现文件下载功能,其他平台的下载都很成熟,网上的例子也比较多,我就自己项目中实现的下载功能做个总结,你可以参考我的写法实现功能。
下载封装基于axios实现的下载功能。

1.下载文件url:xxx

2.文件操作封装类:FileUtil ,是桃花源长老的文件封装库,第三方库,各种工具类很多,很方便

3.下载方法:dowLoadFileCallBack

4.下载封装:axiosClient.downLoadFil

简单的介绍,详细的下载步骤如下:

//下载方法,开始下载

startDownLoadFileTask(){//下载文件路径let testUrl ='xxx'if (FileUtil.accessSync(this.fileSavePath)&&this.downLoadFile.fileDownLoadStatus =='3') {WinLog.info('文件存在,不用下载直接打开')this.previewFileMethod();return;}//先删除旧的未下载完毕的文件if (FileUtil.accessSync(this.fileSavePath)) {FileUtil.unlinkSync(this.fileSavePath);}HttpRequest.dowLoadFileCallBack(testUrl,this.fileSavePath,({onResult:(downLoadInfo:WinDownloadFileModel)=>{//下载状态值,主要是用来区分图片的展示状态this.downStatusName = 'ic_downing_status';if (this.progress==100) {this.downStatusName = 'ic_play_status';}if (downLoadInfo.fileDownLoadStatus=='3') {downLoadInfo.fileUrl = this.downLoadFile.fileUrl;this.downLoadFile.fileDownLoadStatus = '3';//更新本地数据库状态BaseDownFileQueryManager.updateDownFileTableData(downLoadInfo);}//下载进度条的值显示this.progress = downLoadInfo.fileDownProgress;//计算下载的文件大小this.fileSize = `文件大小:${FileUtil.getFormatFileSize(downLoadInfo.fileLength)}`}}),({onError:(error:string)=>{this.downStatusName = 'ic_needdown_status';WinLog.error('下载文件报错:'+ error);this.downLoadFile.fileDownLoadStatus = '2';}}))}
HttpRequest类,下载的方法

/*

  • 文件下载方法
  • @param url下载地址
  • @param filePath文件路径
  • @param successCallBack成功回调
  • @param failureCallBack
  • */
static dowLoadFileCallBack(url:string,filePath:string,successCallBack?:DownLoadCallback,failureCallBack?:DownLoadErrorCallback){const commonHeader: AxiosHeaders = new AxiosHeaders()commonHeader.set('Accept-Language', i18n.System.getSystemLanguage())commonHeader.set('User-Agent', commonUtils.getUserAgent())commonHeader.set('Content-Type', 'application/x-www-form-urlencoded')axiosClient.downLoadFile(filePath,{url: url,headers: commonHeader,showLoading: false,},successCallBack,failureCallBack);}
}
//自定义封装的回调类
export interface DownLoadCallback {/*** 下载回调* @param popInfo*/onResult?: (downLoadingInfo: WinDownloadFileModel) => void;
}
export interface DownLoadErrorCallback {onError?: (error: string) => void;
}
文件下载的具体实现方法,主要是基于axios的文件下载方法,进行了二次封装,适用于自己的项目下载,你也可以参看我的方法,改成适合你的项目用法,都是很简单的,我这个只是单文件的下载,还没进行多文件同时下载,多文件下载需要进行线程控制,以及队列控制。
/** 文件下载* **/downLoadFile(filePath:string,config?: HttpRequestConfig,successCallBack?:DownLoadCallback,failureCallBack?:DownLoadErrorCallback){axios({url: config?.url,method: 'get',context: getContext(this),filePath: filePath ,onDownloadProgress: (progressEvent: AxiosProgressEvent): void => {//下载回掉,状态设置,以及进度的回调let downProgressModel = new WinDownloadFileModel();if (progressEvent.total&&progressEvent.total>0) {downProgressModel.fileDownLoadStatus = '2';downProgressModel.fileDownProgress = NumberUtil.toFloat((progressEvent.loaded / progressEvent.total * 100).toFixed(2).toString());downProgressModel.fileLength = progressEvent.total;if (successCallBack&&successCallBack.onResult) {successCallBack.onResult(downProgressModel);}}else {downProgressModel.fileDownLoadStatus = '1';downProgressModel.fileDownProgress = 0if (successCallBack&&successCallBack.onResult) {successCallBack.onResult(downProgressModel);}}}}).then((res: AxiosResponse<string>) => {//下载完毕的回调winLog.info('down load finish:'+ JSON.stringify(res));let downProgressModel = new WinDownloadFileModel();downProgressModel.fileDownLoadStatus = '3';downProgressModel.fileDownProgress = 100;//计算下载文件的大小let fileSize = FileUtil.getFileDirSize(filePath);downProgressModel.fileLength = fileSize;if (successCallBack&&successCallBack.onResult) {successCallBack.onResult(downProgressModel);}    }).catch((error: AxiosError) =>{//下载失败的回调if (failureCallBack&&failureCallBack.onError) {failureCallBack.onError(error.message);}})}

这些代码就可以实现单文件的下载,以及进度条的展示,以及下载状态的更新。有什么疑问可以随时询问,感谢mark。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单一周日期展示及选择切换

医院挂号&#xff0c;可能需要切换日期&#xff0c;选择一周内的某一天。 提供一周内的日期段&#xff0c;通过点击&#xff0c;切换到不同天。 简单的js&#xff0c;html实例。切换玩调用后台接口&#xff0c;实现后续逻辑。 使用Vue,插值语法&#xff0c;更简单。 一周日历…

二叉树的前,中,后序遍历

我们来了解一下二叉树的遍历&#xff0c;话不多说 二叉树的遍历的概念&#xff1a; 二叉树有四种遍历方式&#xff0c;分别为前序遍历&#xff0c;中序遍历&#xff0c;后序遍历和层序遍历&#xff0c;但我们今天谈谈前三种&#xff0c;并实现它 前序遍历&#xff1a; 按照根…

golang Error的一些坑

golang Error的一些坑 golang error的设计可能是被人吐槽最多的golang设计了。 最经典的err!nil只影响代码风格设计&#xff0c;而有一些坑会导致我们的程序发生一些与我们预期不符的问题&#xff0c;开发过程中需要注意。 ​​ errors.Is​判断error是否Wrap不符合预期 ​…

逼用户升级Win11,微软开始给Win10限速

随着Windows10的支持时间越来越短&#xff0c;微软也加大了对Win10用户的驱赶力度。 最近&#xff0c;微软官宣了将要在今年6月份降低OneNote for Windows 10的同步速度。软件也将和Windows10在今年的10月14日一同停止支持和维护。 这将影响实时协作和多设备访问。 对OneNote…

SpringMVC_day02

一、SSM 整合 核心步骤 依赖管理 包含 SpringMVC、Spring JDBC、MyBatis、Druid 数据源、Jackson 等依赖。注意点&#xff1a;确保版本兼容性&#xff08;如 Spring 5.x 与 MyBatis 3.5.x&#xff09;。 配置类 SpringConfig&#xff1a;扫描 Service 层、启用事务管理、导入…

Android14 原生PackageInstaller安装某些apk报错问题

最近遇到Android14安装客户一个大型app的时候&#xff0c;执行到开始安装的时候就直接闪退了&#xff0c;查看log发现下面报错&#xff1a; 03-25 18:01:29.531 3085 3085 E AndroidRuntime: java.lang.RuntimeException: Could not copy bitmap to parcel blob. 03-25 18:01:2…

SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索

在数据驱动的应用开发中&#xff0c;基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架&#xff0c;提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度&#xff0c;系统对比分析SQLAlchemy中关键词搜索的最佳实…

基于 ffmpeg 实现合并视频

ffmpeg是一个强大的多媒体处理工具&#xff0c;支持视频文件的合并。 列出目录下所有MP4文件 import os import glob# 当前目录 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目录下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…

算法每日一练 (20)

&#x1f4a2;欢迎来到张翊尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (20)不同路径 II题目描述解题思路解题代…

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 终端命令&#xff0c;用于显示当前系统的硬件架构&#xff1b; 返回 返回系统的CPU架构类型&#xff0c;用于判断软件兼容性&#xff1b; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …

sql结尾加刷题

找了一下mysql对extractvalue()、updatexml()函数的官方介绍https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html#function_extractvalue ExtractValue(xml_frag, xpath_expr) 知识点 解释一下这两个参数xml_frag&#xff0c;是xml标记片段&#xff0c;第二个参数…

JVM类加载过程详解

文章目录 前言1.加载2.链接验证文件格式验证元数据验证字节码验证符号引用验证 准备解析 3.初始化4.类卸载 前言 类从被加载到虚拟机内存中开始到卸载出内存为止&#xff0c;它的整个生命周期可以简单概括为 7 个阶段&#xff1a;加载&#xff08;Loading&#xff09;、验证&a…

el-select 可搜索下拉框 在ios、ipad 无法唤出键盘,造成无法输入

下一篇&#xff1a;el-select 可搜索下拉框&#xff0c;选中选项后&#xff0c;希望立即失去焦点&#xff0c;收起键盘&#xff0c;执行其他逻辑 【效果图】&#xff1a;分组展示选项 >【去界面操作体验】 首先&#xff0c;通过 夸克浏览器的搜索: el-select 在 ipad 输入框…

前端框架的定制化:满足项目独特需求

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字化转型浪潮中&#xff0c;前端技术体系已成为企业构建数字竞争力的核心战场。当标准化前端框架…

Flutter网络请求封装:高效、灵活、易用的Dio工具类

在Flutter开发中&#xff0c;网络请求是必不可少的功能。为了简化代码、提高开发效率&#xff0c;我们通常会封装一个网络请求工具类。本文基于Dio库&#xff0c;详细介绍如何封装一个高效、灵活、易用的网络请求工具类&#xff0c;支持以下功能&#xff1a; 单例模式&#xf…

MyBatis-Plus(SpringBoot版)学习第一讲:简介入门案例

目录 1. MyBatis-Plus简介 1.1 简介 1.2 特性 1.3 支持的数据库 1.4 框架结构 1.5 代码及文档地址 2. 入门案例 2.1 开发环境 2.2 创建数据库及表 1. 创建表 2. 添加数据 2.3 创建SpringBoot工程 1. 初始化工程 2. 引入依赖 3. IDEA中安装lombok插件 ​编辑 2.4 编…

k8s高可用集群安装

一、安装负载均衡器 k8s负载均衡器 官方指南 1、准备三台机器 节点名称IPmaster-1192.168.1.11master-2192.168.1.12master-3192.168.1.13 2、在这三台机器分别安装haproxy和keepalived作为负载均衡器 # 安装haproxy sudo dnf install haproxy -y# 安装Keepalived sudo yum …

【PPO】小白的强化学习算法笔记

参考视频 零基础学习强化学习算法&#xff1a;ppo 基础概念 environment环境agent&#xff1a;智能体&#xff0c;玩游戏的你state&#xff1a;当前状态&#xff0c;observation看到的部分&#xff0c;有的游戏只能看见state的一部分action&#xff1a;agent做出的动作reward…

Flink介绍与安装

Apache Flink是一个在有界数据流和无界数据流上进行有状态计算分布式处理引擎和框架。Flink 设计旨在所有常见的集群环境中运行&#xff0c;以任意规模和内存级速度执行计算。 一、主要特点和功能 1. 实时流处理: 低延迟: Flink 能够以亚秒级的延迟处理数据流&#xff0c;非常…

深入解析 JVM 内存区域及核心概念

深入解析 JVM 内存区域及核心概念 Java 虚拟机&#xff08;JVM&#xff09;内部划分了多个内存区域&#xff0c;每个区域存储不同类型的数据并承担不同的职责。本文将详细介绍以下内容&#xff1a; 程序计数器&#xff1a;记录当前线程正在执行的字节码指令及其“行号”信息&a…