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

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

上传任务进行中时不能返回上传进度。

代码如下:

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 (上传下载) 上传文件时无法获取上传进度的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

progress 回调了两次,第一次 有上传进度,等一会,第二次回调,直接上传完成了,回调上传完成。

100M 的文件 就回调了两次 progress 这个是为啥?如何解决?

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


在HarmonyOS Next中,使用@ohos.request上传文件时,可通过on('progress')事件监听上传进度。示例代码:

import request from '@ohos.request';

let uploadTask = request.uploadFile({
  url: 'your_server_url',
  files: [{filename: 'test.txt', name: 'file', uri: 'internal://app/test.txt'}],
  on: {
    progress: (receivedSize: number, totalSize: number) => {
      console.log(\`进度: \${(receivedSize/totalSize*100).toFixed(2)}%\`);
    }
  }
});

确保totalSize参数在服务器响应头中正确返回。若进度无回调,检查服务器是否支持Range请求或返回Content-Length头。

在HarmonyOS Next中,使用@ohos.request模块上传文件时获取进度的问题,可能是由于配置或回调处理不当导致的。从您的代码和日志来看,虽然进度回调被触发(日志中显示了progress状态32),但UI层可能没有正确更新。

关键点分析:

  1. 配置中gauge: falseprecise: false会限制进度回调的频率,建议设置为true以获得更精确的进度反馈。

  2. 进度回调处理函数中需要显式处理progress对象:

BaseRequestUtil.onProgressTask(task, (progress: request.agent.Progress) => {
    // 计算当前进度百分比
    const percent = (progress.processed / progress.sizes[0]) * 100;
    Logger.d(`上传进度: ${percent.toFixed(2)}%`);
});
  1. 日志显示上传确实完成了(state 64),说明基础功能正常,问题可能出在:
  • 进度回调处理函数未正确实现
  • UI线程未及时更新进度显示
  • 后台模式(Mode.BACKGROUND)可能影响回调频率

建议检查进度回调函数的实现是否完整,并确保在主线程更新UI。如果问题依旧,可以尝试改用FOREGROUND模式测试。

回到顶部