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
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层可能没有正确更新。
关键点分析:
-
配置中
gauge: false
和precise: false
会限制进度回调的频率,建议设置为true以获得更精确的进度反馈。 -
进度回调处理函数中需要显式处理progress对象:
BaseRequestUtil.onProgressTask(task, (progress: request.agent.Progress) => {
// 计算当前进度百分比
const percent = (progress.processed / progress.sizes[0]) * 100;
Logger.d(`上传进度: ${percent.toFixed(2)}%`);
});
- 日志显示上传确实完成了(state 64),说明基础功能正常,问题可能出在:
- 进度回调处理函数未正确实现
- UI线程未及时更新进度显示
- 后台模式(Mode.BACKGROUND)可能影响回调频率
建议检查进度回调函数的实现是否完整,并确保在主线程更新UI。如果问题依旧,可以尝试改用FOREGROUND模式测试。