HarmonyOS 鸿蒙Next中@ohos.request (上传下载) 上传文件 progress 无法实时获取进度

HarmonyOS 鸿蒙Next中@ohos.request (上传下载) 上传文件 progress 无法实时获取进度

代码如下:

static UploadFileBase() :Promise<request.agent.Task>{

  // ..... el2/100/base/<包名>/haps/entry/cache
  let filePath = FilePathUtil.getCacheDir(AppUtil.getContext()) + '/test.apk'
  let attachments: Array<request.agent.FormItem> = [
    {
      name: "file", value: {
        filename: "filename",
        mimeType: "application/octet-stream",
        path: filePath,
      }
    }];

  let config: request.agent.Config = {
    action: request.agent.Action.UPLOAD,
    url: 'https://xxxxxxxx',
    title: 'createTest',
    description: 'Sample code for create task',
    mode: request.agent.Mode.BACKGROUND,
    overwrite: false,
    method: "POST",
    data: attachments,
    // saveas: "./",
    network: request.agent.Network.ANY,
    metered: false,
    roaming: true,
    retry: true,
    redirect: true,
    index: 0,
    begins: 0,
    ends: -1,
    gauge: false,
    precise: false,
    token: "it is a secret",
    multipart: true
  };
  return config
}

static downloadFile(config: request.agent.Config): Promise<request.agent.Task> {
  return request.agent.create(getContext(), config)
}





BaseRequestUtil.downloadFile(BaseRequestUtil.getUploadConfig()).then((task:request.agent.Task)=>{
this.upLoadTask = task
BaseRequestUtil.onProgressTask(task,(progress: request.agent.Progress)=>{

})

BaseRequestUtil.onCompletedTask(task,(progress: request.agent.Progress)=>{

})
task.start()

}).catch((error:BusinessError)=>{
  Logger.d('上传 异常' + error.code + "message = " + error.message)
})


调用日志:


05-23 16:19:41.465   32979   A0FF00/com.soh...[Hxe_Log_Tag]  com.sohuinc.SOHUEhr   D     upload task progress.{"state":32,"index":0,"processed":76922302,"sizes":[120845505],"extras":{}}
05-23 16:19:50.669   32979   A0FF00/com.soh...[Hxe_Log_Tag]  com.sohuinc.SOHUEhr   D     upload task progress.{"state":32,"index":0,"processed":120845505,"sizes":[120845505],"extras":{"content-type":"application/json","date":"Fri, 23 May 2025 08:19:50 GMT","server":"nginx","trace-id":"c50116d8682e43458d30f895285ea0f9.57361.17479883865170097","vary":"Origin, Access-Control-Request-Method, Access-Control-Request-Headers"}}
05-23 16:19:50.682   32979   A0FF00/com.soh...[Hxe_Log_Tag]  com.sohuinc.SOHUEhr   D     upload task completed.{"state":64,"index":0,"processed":120845505,"sizes":[120845505],"extras":{"content-type":"application/json","date":"Fri, 23 May 2025 08:19:50 GMT","server":"nginx","trace-id":"c50116d8682e43458d30f895285ea0f9.57361.17479883865170097","vary":"Origin, Access-Control-Request-Method, Access-Control-Request-Headers","body":"{\"result\":\"true\",\"message\":{\"fileUniqueId\":\"174798838811467337B086099C8B9DD9937BE312E93BD\",\"thumbnailUniqueId\":null,\"thumbnailWidth\":0,\"thumbnailHeight\":0,\"progress\":null},\"errorCode\":\"0\"}"}}

有做过这方面功能的大佬指点一下么?


更多关于HarmonyOS 鸿蒙Next中@ohos.request (上传下载) 上传文件 progress 无法实时获取进度的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

鸿蒙Next中@ohos.request上传文件的progress回调可能存在事件触发频率限制。系统默认会优化进度更新频率以减少性能消耗,因此无法获取逐字节的实时进度。可通过config配置中的granularity参数调整进度回调粒度,将其设为较小的数值(如1)可提高回调频率。若仍不满足需求,需自行实现分片上传逻辑,在每片上传完成后手动更新进度。

更多关于HarmonyOS 鸿蒙Next中@ohos.request (上传下载) 上传文件 progress 无法实时获取进度的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,@ohos.request模块的进度回调确实存在更新频率问题。根据您的代码和日志分析,主要问题出在BACKGROUND模式下进度回调的触发机制。

  1. 当前问题分析:
  • 日志显示只有两个进度回调(76MB和120MB),说明BACKGROUND模式下进度更新不频繁
  • 这是系统为优化性能而设计的机制,BACKGROUND模式会降低回调频率
  1. 解决方案建议:
  • 将mode改为FOREGROUND模式:
mode: request.agent.Mode.FOREGROUND
  • FOREGROUND模式会提供更频繁的进度更新
  • 但需要注意这会增加性能开销
  1. 其他注意事项:
  • 确保precise参数设置为true以获得更精确的进度
  • 大文件上传时,FOREGROUND模式可能会影响应用性能,需权衡选择

FOREGROUND模式应该能解决您遇到的进度更新不及时问题,但请根据实际场景评估性能影响。

回到顶部