更新记录

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)

headersformData 请传普通对象并转换为 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 == 0totalChunks == 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 查询仍在运行的任务,返回 uploadIdstatusprogressstatus 可能为:

pendinguploadingcompletedfailedcancelled

服务端协议

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

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。