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

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 = 0
          if (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。

相关文章:

  • Android14 原生PackageInstaller安装某些apk报错问题
  • 【初探数据结构】快速排序的四种实现方式(Hoare,挖坑,前后指针,非递归)
  • 深入解析 C++20 中的 std::bind_front:高效函数绑定与参数前置
  • Java高频面试之集合-18
  • 基于SSM框架的线上甜品销售系统(源码+lw+部署文档+讲解),源码可白嫖!
  • Java并发编程 什么是分布式锁 跟其他的锁有什么区别 底层原理 实战讲解
  • 加快推进智慧水务发展,实现水务系统安全、高效运行
  • 2024年3月全国计算机等级考试真题(二级C语言)
  • 树莓派ollama docker报错尝试网上方法
  • 悟空crm v12安装好后出现 网络错误问题(已解决)
  • sql server如何提高索引命中率
  • SOLIDEDGE 至 STL 转换:数字化设计制造的关键衔接
  • Occlum 是一个内存安全的、支持多进程的 library OS,特别适用于 Intel SGX。
  • GitHub Copilot平替:CodeGeeX 2.0实测报告
  • 牛贝跟卖系统Niubox贴牌模式有哪些功能?
  • rnn的ho的维度 (num_layers * num_directions, batchsize, hidden_size)
  • NVIDIA TensorRT 深度学习推理加速引擎详解
  • 搭建Kubernetes集群
  • @Autowired 和 @Resource 注解的区别
  • 德昂观点:如何看待MicroStrategy改名为Strategy?
  • 自己做网站软件/哈尔滨网络seo公司
  • 椒江设计公司/优化大师手机版下载安装app
  • vb做网站/高质量发展服务业
  • 北京通州区网站制作/汕头seo优化
  • 市政府统一建设网站的提议/外贸网站推广方法之一
  • 厦门好的做网站公司/泰安短视频seo