更新记录
1.1.1(2026-08-30)
- 优化插件使用文档
- 更新插件市场展示及销售信息
1.1.0(2026-08-30)
新增
- 新增 HarmonyOS(app-harmony)平台实现:纯 UTS 编写(编译为 ArkTS),基于
@ohos.file.fs读取文件、@ohos.net.http发送分块、@ohos.security.cryptoFramework计算文件 MD5 - 新增
utssdk/app-harmony/module.json5,声明ohos.permission.INTERNET网络权限
变更
package.json平台矩阵:uni-app x 的 android / ios / harmony 标记为y(此前已有 Android/iOS 实现,标记与事实不符)
说明
- 鸿蒙端行为与 Android 端对齐:multipart 协议、进度回报节奏(500ms)、百分比取整规则、取消回调(errCode 9010007)、启动通知(
uploadTime == 0的 success 回调携带真实 uploadId) - 分块失败时该并发 worker 停止领取新分块,其余在途分块传完后整体报失败(最终结果语义与 Android 一致)
- 已知限制:
timeout同时作为 HTTP 读超时,弱网下 1MB 分块可能触发超时(errCode 9010004),可按需调大 timeout 或调小 chunkSize
验证
- 鸿蒙模拟器(HarmonyOS 6.0.1)端到端实测通过:3MB/20MB 文件上传(1MB 分块、3 并发)、服务端合并文件 MD5 与源文件/应用内
cryptoFramework计算值一致、启动通知契约、中途取消(9010007 + 服务端分片不合并)、服务端关停(9010003)、文件不存在(9010001) uni.chooseFile在鸿蒙端返回file://docs/storage/Users/currentUser/...文件库 URI,实现已按fs.openSync(uri)方式支持
平台兼容性
uni-app(5.24)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | √ | - | - | - | - | √ | √ | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.24)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | √ | √ | - | - |
hens-upload-chunk 分块上传
用于 uni-app x App 的大文件分块上传插件,支持并发上传、进度回调、任务状态查询和取消任务。
兼容性
| 平台 | 支持情况 | 系统要求 |
|---|---|---|
| Android | 支持 | Android 5.0(API 21)及以上 |
| iOS | 支持 | iOS 12.0 及以上 |
| HarmonyOS | 支持 | 以插件市场平台兼容信息为准 |
| Web、小程序 | 不支持 | - |
快速开始
import {
startChunkUpload,
cancelUpload,
getUploadStatus,
ChunkUploadOptions,
UploadProgress,
UploadResult,
UploadFail,
CancelUploadOptions,
CancelUploadResult,
GetUploadStatusOptions,
UploadStatusResult
} from '@/uni_modules/hens-upload-chunk'
let currentUploadId = ''
const options : ChunkUploadOptions = {
filePath: '/path/to/video.mp4',
uploadUrl: 'https://example.com/upload',
chunkSize: 1024 * 1024,
maxConcurrency: 3,
timeout: 30000,
headers: {
'Authorization': 'Bearer your-token'
} as UTSJSONObject,
formData: {
'userId': '12345',
'fileName': 'video.mp4'
} as UTSJSONObject,
: (progress : UploadProgress) => {
console.log('上传进度: ' + progress.percentage.toString() + '%')
console.log('上传速度: ' + progress.uploadSpeed.toString() + ' bytes/s')
},
success: (result : UploadResult) => {
// uploadTime 为 0 时是任务创建通知,可在这里取得取消和查询所需的 uploadId。
if (result.uploadTime == 0) {
currentUploadId = result.uploadId
return
}
console.log('上传完成: ' + result.uploadId)
},
fail: (error : UploadFail) => {
console.log('上传失败: ' + error.errCode.toString() + ' ' + error.errMsg)
},
complete: (_ : any) => {
console.log('上传任务结束')
}
}
startChunkUpload(options)
headers 和 formData 请传普通对象并转换为 UTSJSONObject,不要传 Map。
取消上传
const options : CancelUploadOptions = {
uploadId: currentUploadId,
success: (result : CancelUploadResult) => {
console.log('已取消: ' + result.uploadId)
},
fail: (error : UploadFail) => {
console.log('取消失败: ' + error.errMsg)
}
}
cancelUpload(options)
查询状态
const options : GetUploadStatusOptions = {
uploadId: currentUploadId,
success: (result : UploadStatusResult) => {
console.log('状态: ' + result.status)
console.log('进度: ' + result.progress.percentage.toString() + '%')
},
fail: (error : UploadFail) => {
console.log('查询失败: ' + error.errMsg)
}
}
getUploadStatus(options)
状态查询用于仍在运行的任务。任务成功、失败或取消后可能立即被清理,此时查询会返回“上传任务不存在”。
API
startChunkUpload(options)
开始上传,无返回值。任务创建成功和上传完成时会分别调用一次 success:
- 任务创建:
uploadTime == 0、totalChunks == 0,此时保存uploadId。 - 上传完成:
uploadTime > 0,此时读取最终结果。
complete 只在上传最终成功或失败后调用,不会随任务创建通知调用。
ChunkUploadOptions
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
filePath |
string |
是 | - | 可访问的本地文件路径 |
uploadUrl |
string |
是 | - | 接收分块的 HTTP(S) POST 地址 |
chunkSize |
number |
否 | 1048576 |
分块大小,单位为字节 |
maxConcurrency |
number |
否 | 3 |
最大并发请求数 |
timeout |
number |
否 | 30000 |
单次请求超时,单位为毫秒 |
headers |
UTSJSONObject \| null |
否 | null |
附加请求头,值会按字符串发送 |
formData |
UTSJSONObject \| null |
否 | null |
每个分块请求携带的附加表单字段,值会按字符串发送 |
resumable |
boolean |
否 | true |
保留参数;当前版本不提供跨进程或应用重启后的断点续传 |
onProgress |
(UploadProgress) => void |
否 | - | 上传进度回调 |
success |
(UploadResult) => void |
否 | - | 任务创建及最终成功回调 |
fail |
(UploadFail) => void |
否 | - | 最终失败回调 |
complete |
(any) => void |
否 | - | 最终完成回调,成功或失败都会调用 |
UploadProgress
| 字段 | 类型 | 说明 |
|---|---|---|
uploadedBytes |
number |
已上传字节数 |
totalBytes |
number |
文件总字节数 |
percentage |
number |
上传百分比,范围 0-100 |
currentChunk |
number |
已完成的分块数量 |
totalChunks |
number |
总分块数量 |
uploadSpeed |
number |
上传速度,单位 bytes/s |
remainingTime |
number |
预计剩余时间,单位秒 |
UploadResult
| 字段 | 类型 | 说明 |
|---|---|---|
success |
boolean |
是否成功 |
uploadId |
string |
上传任务 ID |
totalChunks |
number |
总分块数量;任务创建通知中为 0 |
uploadTime |
number |
上传耗时,单位毫秒;任务创建通知中为 0 |
fileHash |
string(可选) |
文件哈希,平台无法提供时为空 |
serverResponse |
string(可选) |
服务端响应,平台无法提供时为空 |
cancelUpload(options)
使用任务创建通知返回的 uploadId 取消仍在运行的任务。成功结果包含:
| 字段 | 类型 | 说明 |
|---|---|---|
cancelled |
boolean |
是否取消成功 |
uploadId |
string |
被取消的任务 ID |
getUploadStatus(options)
使用 uploadId 查询仍在运行的任务,返回 uploadId、status 和 progress。status 可能为:
pending、uploading、completed、failed、cancelled。
服务端协议
uploadUrl 必须接收 multipart/form-data POST 请求。插件会为每个分块发送以下字段:
| 字段 | 说明 |
|---|---|
file |
当前分块的二进制数据 |
chunkIndex |
从 0 开始的分块索引 |
chunkSize |
当前分块字节数 |
totalChunks |
总分块数量 |
uploadId |
同一上传任务的唯一 ID |
formData 中的字段也会随每个分块发送。服务端对已接收的分块应返回任意 2xx 状态码,并在收齐同一 uploadId 的全部分块后按 chunkIndex 顺序合并。插件不会额外发送“合并完成”请求。
为适应并发请求和网络重试,建议服务端将 uploadId + chunkIndex 作为幂等键。不要依赖 multipart 中的分块文件名识别原文件;原文件名等业务信息请通过 formData 明确传递。
错误码
| 错误码 | 说明 | 建议处理 |
|---|---|---|
9010001 |
文件不存在或无法访问 | 检查文件路径及访问权限 |
9010002 |
文件读取失败 | 检查文件权限和设备存储空间 |
9010003 |
网络连接失败 | 检查网络和上传地址 |
9010004 |
上传超时 | 增大 timeout 或减小 chunkSize |
9010005 |
服务端错误 | 检查服务端状态和响应码 |
9010006 |
参数错误或任务不存在 | 检查参数和 uploadId |
9010007 |
上传已取消 | 按业务需要更新界面状态 |
9010009 |
存储空间不足 | 清理设备存储空间 |
9010010 |
未知错误 | 记录 errMsg 后进一步排查 |
使用注意
- 业务应用负责选择文件并取得有效的本地路径;涉及相册、媒体或外部存储时,应在业务侧申请相应权限。
- 不要在
headers中手动设置Content-Type,multipart boundary 由插件生成。 - 生产环境建议使用 HTTPS。使用 HTTP 时,需要按目标平台配置明文网络访问策略。
- 应用进入后台后,上传可能受到系统调度或进程回收影响;当前版本不承诺后台持续上传。
- 弱网环境可减小
chunkSize、降低maxConcurrency并适当增大timeout。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 392
赞赏 0
下载 12542089
赞赏 1947
赞赏
京公网安备:11010802035340号