更新记录
0.0.1(2026-08-01)
支持下载
平台兼容性
uni-app(4.24)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | 12 | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.13)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | × | 12 | × | × |
Zhangddq Upload 插件使用说明
插件 ID:
zhangddq-upload版本:0.0.1平台:仅 iOS App(app-ios: y,app-android: n) 类型:UTS 插件(uni_modules),支持 Vue2 / Vue3
一、插件简介
zhangddq-upload 是一个仅适用于 iOS 的 UTS 插件,用于在 uni-app 中实现后台多部分(multipart/form-data)文件上传。
底层基于 iOS 原生的 URLSessionConfiguration.background,可在应用进入后台或被系统挂起时继续上传任务,适用于大文件、长时间上传场景。
当前能力范围
- 仅支持 iOS App。
- 仅支持单文件上传。
- 仅支持 multipart/form-data 形式上传。
- 使用
URLSessionConfiguration.background后台会话配置。 - 将 multipart 请求体写入临时文件,使用
uploadTask(with:fromFile:)上传。 - 大文件以分块流式写入请求体,避免整文件读入内存。
- 支持进度回调、成功/失败/取消回调,以及任务查询。
二、目录结构
uni_modules/zhangddq-upload
├── package.json # 插件配置与平台兼容性声明
├── readme.md
└── utssdk
├── interface.uts # 对外类型定义(TypeScript 风格)
└── app-ios
├── index.uts # UTS 入口,JS 侧 API 实现
├── ZhangddqUploadNative.swift # iOS 原生实现
└── config.json
三、API
通过如下方式导入:
import {
uploadFile,
setUploadEventListener,
getUploadTask,
getUploadTasks,
removeUploadTask
} from '@/uni_modules/zhangddq-upload'
1. uploadFile(options) — 上传文件
参数 UploadFileOptions
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
url |
string | 是 | 上传地址 |
filePath |
string | 是 | 本地文件路径,iOS 上推荐原生 file:// URL,也支持以 / 开头的绝对路径 |
name |
string | 否 | multipart 文件字段名,默认 file |
timeout |
number | string | 否 | 超时时间(毫秒),数字或字符串均可,默认 1200000(20 分钟) |
header |
UTSJSONObject | 否 | 请求头;Content-Type 由插件自动生成,传入的 content-type 会被忽略 |
formData |
UTSJSONObject | 否 | multipart 文本字段(键值对) |
success |
(result) => void | 否 | 成功回调 |
fail |
(result) => void | 否 | 失败回调 |
complete |
(result) => void | 否 | 完成回调(无论成功失败) |
返回值:UploadTask
| 字段/方法 | 类型 | 说明 |
|---|---|---|
taskId |
string | 任务 ID |
abort() |
() => void | 取消上传 |
onProgressUpdate |
(cb) => void | 注册进度回调 |
offProgressUpdate |
(cb?) => void | 移除进度回调 |
进度回调 UploadFileProgressUpdateCallbackResult
| 字段 | 类型 | 说明 |
|---|---|---|
taskId |
string | 任务 ID |
progress |
number | 进度(0–100) |
totalBytesSent |
number | 已上传字节数 |
totalBytesExpectedToSend |
number | 总字节数 |
成功回调 UploadFileSuccessResult
| 字段 | 类型 | 说明 |
|---|---|---|
taskId |
string | 任务 ID |
data |
string | 服务器响应文本 |
statusCode |
number | HTTP 状态码 |
header |
UTSJSONObject | 响应头 |
失败回调 UploadFileFailResult
| 字段 | 类型 | 说明 |
|---|---|---|
taskId |
string | 任务 ID |
errCode |
number | 错误码 |
errMsg |
string | 错误信息 |
2. setUploadEventListener(listener) — 全局事件监听
注册一个全局上传事件监听器,所有任务的事件(进度 / 成功 / 失败)都会通过该监听器统一派发。
setUploadEventListener((event) => {
// event.type: "progress" | "success" | "fail"
console.log(event.type, event.taskId)
})
事件结构 UploadEvent:
| 字段类型 | 说明 |
|---|---|
type |
事件类型:progress / success / fail |
taskId |
任务 ID |
progress |
进度(0–100),progress 事件有值 |
totalBytesSent、totalBytesExpectedToSend |
progress 事件有值 |
data、statusCode、header |
success 事件有值 |
errCode、errMsg |
fail 事件有值 |
3. 任务查询
getUploadTask(taskId):返回指定任务的当前状态(UTSJSONObject),不存在返回null。getUploadTasks():返回所有任务的列表(按创建时间倒序)。removeUploadTask(taskId):从记录中移除指定任务并清理临时文件。
任务记录字段包括:taskId、url、filePath、status、progress、totalBytesSent、totalBytesExpectedToSend、data、statusCode、header、errCode、errMsg、createdAt、updatedAt。
status 取值:uploading / success / fail / aborted。
四、错误码说明
| errCode | 说明 |
|---|---|
10002 |
URL 或 filePath 非法 |
10003 |
文件不存在 |
10004 |
构建 multipart 请求体失败 |
10006 |
上传被取消(abort 或系统 NSURLErrorCancelled) |
10007 |
上传失败(网络错误等) |
10008 |
服务器返回非 2xx 状态码 |
仅 HTTP 状态码在 200–299 之间时判定为成功,其他均通过
fail回调返回。
五、使用示例
基本用法
const task = uploadFile({
url: 'https://example.com/upload',
filePath: 'file:///path/to/file.mp4',
name: 'file',
timeout: 1200000,
header: {
Authorization: 'Bearer xxx'
},
formData: {
userId: '123'
},
success: (res) => {
console.log('上传成功', res.statusCode, res.data)
},
fail: (err) => {
console.log('上传失败', err.errCode, err.errMsg)
},
complete: () => {
console.log('上传结束')
}
})
task.onProgressUpdate((res) => {
console.log(`进度 ${res.progress}% (${res.totalBytesSent}/${res.totalBytesExpectedToSend})`)
})
// 如需取消
// task.abort()
OSS 表单上传方式(推荐对接对象存储)
const uploadTask = uploadFile({
url: oss.serverUrl,
filePath: file,
name: 'file',
timeout: '1200000',
formData: {
key: oss.key,
policy: oss.policy,
OSSAccessKeyId: oss.OSSAccessKeyId,
signature: oss.sign,
success_action_status: '200'
},
success: (res) => {
if (res.statusCode === 200) {
console.log(res.data)
}
}
})
全局事件监听
setUploadEventListener((event) => {
switch (event.type) {
case 'progress':
console.log(`[${event.taskId}] 进度 ${event.progress}%`)
break
case 'success':
console.log(`[${event.taskId}] 成功 statusCode=${event.statusCode}`)
break
case 'fail':
console.log(`[${event.taskId}] 失败 errCode=${event.errCode} errMsg=${event.errMsg}`)
break
}
})
六、filePath 注意事项
iOS 上 filePath 推荐使用原生 file:// URL:
- 以
file://开头 → 按原生 URL 解析 - 以
/开头 → 按绝对路径解析 - 其他情况会被视为无效,回调
fail(errCode: 10002)
上传成功或失败后,插件会自动清理生成的 multipart 临时请求体文件;调用 removeUploadTask(taskId) 也会清理对应临时文件。
七、平台与配置说明
- 插件已在
package.json中声明:app-ios: y、app-android: n,H5/小程序均不支持。 - 后台会话标识(identifier):
cn.cnqxmi.zhangddq-upload.session,使用URLSessionConfiguration.background。 - 启用了
sessionSendsLaunchEvents = true,便于系统在后台上传完成后唤醒应用处理事件。 isDiscretionary = false,避免系统将上传推迟到更合适时机。- 进度轮询间隔为 300ms(由 UTS 侧的
setInterval实现),用于将原生侧的状态变化反馈给 JS 侧回调与事件监听器。
iOS 工程侧建议
由于使用后台 URLSession,请在 iOS 工程中确认:
- 已开启 Background Modes(后台模式),勾选后台 fetch 或后台处理相关能力(视上传策略而定)。
- 在
Info.plist中配置相应权限声明(如访问相册/文件时的NSPhotoLibraryUsageDescription等),具体视业务场景而定。 - 上传大文件时务必对
filePath进行有效性校验,避免无效路径触发10002/10003错误。
八、注意事项
- 仅 iOS 可用:Android / H5 / 小程序端调用无效,请在调用前判断平台或仅在该插件支持的平台上使用。
- 单文件、multipart 上传:不支持多文件或非 multipart 形式上传。
Content-Type:插件会自动生成multipart/form-data; boundary=...,传入的content-type会被忽略。- MIME 推断:插件根据文件后缀推断 MIME(jpg/jpeg、png、wav、mp3、mp4 等),其他默认
application/octet-stream。 - 超时时间:
timeout接受数字或字符串,单位毫秒,默认 20 分钟(1200000)。 - 后台行为:iOS 后台
URLSession由系统调度,存在被系统挂起或延迟的可能;上传结果请以success/fail/全局事件为准,并通过getUploadTask查询实际状态。 - 临时文件:插件会在
NSTemporaryDirectory下生成 multipart 请求体临时文件,上传结束或主动移除任务时会清理。
九、快速集成步骤
- 将
zhangddq-upload放入项目的uni_modules目录(已有)。 - 在需要使用的页面或组件中按“三、API”的方式
import。 - 构造
filePath(建议file://URL)、url以及formData。 - 调用
uploadFile(options),使用onProgressUpdate监听进度,使用success/fail/complete处理结果。 - 如需统一管理多任务事件,使用
setUploadEventListener。 - 需要查询或清理任务时,使用
getUploadTask/getUploadTasks/removeUploadTask。 - 打包自定义基座或提交云端打包时,确认 iOS 平台选中此插件。

收藏人数:
购买普通授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 3
赞赏 0
下载 12488870
赞赏 1938
赞赏
京公网安备:11010802035340号