更新记录
1.2.10(2026-06-17)
- 复修 iOS 云打包
unable to type-check this expression in reasonable time:launchIosPicker主线程闭包拆为runLaunchIosPicker(),减少 Swift 对大闭包表达式的类型推断压力。 - 新增 picker mode、mode 文案、布尔字符串和日志拼接 helper,避免三元表达式与
UIDocumentPickerViewController构造器组合在同一推断链路中。 - 保留
1.2.9的上传响应文本、成功状态码数组和多文件统计字段 SwiftCompile 兼容修复。 - 本版本仅修改
utssdk/app-ios平台实现和发布资料,不修改公共接口、Android、Harmony、Web、小程序或 uni-app 示例。
1.2.9(2026-06-16)
- 修复 iOS 云打包 SwiftCompile:
UploadSuccessItem.data等上传响应文本统一通过 helper 收敛为非空字符串,避免String?直接赋值。 - 修复成功状态码数组处理:
appendSuccessStatusCode返回新数组,避免 Swift 生成物对不可变数组执行追加。 - 修复多文件上传批量统计:成功数量、失败数量和
failResults长度统一转为NSNumber兼容值,避免Int -> NSNumber参数不匹配。 - 保留
parsedData / successStatusCodes / failResults / sequential: false等 1.2.8 上传增强能力,本轮只做 iOS 云打包兼容收口。 - 增强 iOS 云打包回归守卫;本版本需重新提交 iOS 云打包验证。
1.2.8(2026-06-15)
- 新增上传结果增强:
UploadSuccessItem增加parsedData,可通过parseJson将服务器响应 JSON 解析到结构化字段,同时保留data原始字符串。 - 新增上传成功状态码配置:
successStatusCodes支持业务自定义 HTTP 成功状态码;不传或传空数组时默认仍按 200-299 判断成功。 - 新增多文件失败明细:
UploadFilesResult增加failResults,在stopOnFail: false或部分失败场景下返回失败文件、下标和错误对象。 - 优化多文件上传模式:
sequential: false现在会真实并发上传多个文件,进度回调中的index仍对应原始文件下标。 - 同步内置
<lizhao-choose-file />组件:新增parse-json和success-status-codes属性,可在组件上传模式中直接使用响应解析与成功码配置。 - 补充示例与文档:插件示例和项目演示页新增串行/并发、响应 JSON 解析、成功码和部分失败测试入口,README 顶部新增 1.2.8 上传增强说明。
- 发布前验证:Android / Harmony / iOS appResource 均已编译并导出成功,相关 LSP 与 choose-file 回归守卫通过。
平台兼容性
uni-app(4.84)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | - | - | - | - | - | - | - | - | - | - |
uni-app x(4.84)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
lizhao-choose-file
lizhao-choose-file 是面向 uni-app / uni-app x 的文件选择与上传插件。你可以只用 API 做文件选择,也可以直接使用内置 <lizhao-choose-file /> 业务 UI,快速获得上传按钮、进度条、文件数量、文件图标、文件名称、文件大小、删除文件和取消上传能力。
联系方式:信-微:l-z-1-8-7-1512-5421(-去掉,不这样写会被和谐)
1.2.10 iOS 云打包复修
本版本继续收口 iOS 文件选择器云打包兼容问题:launchIosPicker 主线程闭包拆分为小 helper,picker mode、日志文案和布尔字符串拼接均独立计算,降低 Swift 对大闭包表达式的类型推断压力。
升级提示:iOS 端请重新云打包或重新进行 iOS 原生联编;Android / Harmony / Web / 小程序运行逻辑不变。
1.2.9 iOS 云打包修复
本版本在保留 1.2.8 上传增强能力的基础上,收口 iOS 云打包 SwiftCompile 兼容问题,适合准备提交 iOS 云打包或插件市场发布前升级。
| 修复点 | 说明 | 影响 |
|---|---|---|
| 上传成功数据归一 | UploadSuccessItem.data 统一收敛为非空字符串后再写入结果 |
避免 iOS 生成 Swift 时出现 String? 赋值不匹配 |
| 成功状态码数组处理 | successStatusCodes 追加时返回新数组,不再修改不可变数组 |
避免 Swift 生成物对不可变数组执行追加 |
| 批量统计字段 | 多文件上传成功/失败数量和数组长度统一转为 NSNumber 兼容值 |
避免 Int -> NSNumber 参数不匹配 |
| 回归守卫 | 发布脚本锁定 String?、Int -> NSNumber 与上传核心兼容修复 |
防止后续版本回退到云打包失败形态 |
升级提示:本版本修复公共上传核心。iOS 端必须重新云打包或重新进行 iOS 原生联编;Android / Harmony 如需使用最新上传核心,也建议重新运行对应平台原生联编或重新制作自定义基座。
1.2.8 上传增强
本版本重点增强通用 HTTP 上传结果和多文件上传体验,适合需要对接业务上传接口、解析服务端 JSON、展示部分失败结果或提升多文件上传速度的场景。
| 新能力 | 作用 | 使用方式 |
|---|---|---|
| 响应 JSON 解析 | 服务端返回 JSON 字符串时,额外写入 UploadSuccessItem.parsedData,同时保留 data 原文 |
上传配置传 parseJson: true |
| 成功状态码配置 | 后端使用 201 / 204 或固定自定义 HTTP 成功码时,可避免被误判为失败 |
上传配置传 successStatusCodes: [200, 201, 204],空数组保持默认 2xx |
| 多文件失败明细 | stopOnFail: false 时继续上传后续文件,并通过 failResults 查看失败文件、下标和错误 |
查看 UploadFilesResult.failResults |
| 并发上传 | 多文件可同时上传,提升批量附件上传速度 | 上传配置传 sequential: false |
| 示例页测试入口 | 示例页可直接切换串行/并发、JSON 解析、成功码和部分失败测试 | 查看 uni_modules/lizhao-choose-file/example/index.vue 或项目页 pages/chooseFile/chooseFile.vue |
升级提示:本版本修改了 UTS 上传接口类型和 App/Harmony 上传实现。App 端如已使用旧自定义基座,需要重新运行原生联编或重新制作对应平台自定义基座后,才能使用 parsedData / failResults / sequential=false 等最新上传能力。
接入方式怎么选
| 业务需求 | 推荐方式 | 适合场景 |
|---|---|---|
| 只选择一个文件 | pickFile(options) |
表单附件、合同、单个凭证 |
| 选择多个文件 | pickFiles(options) |
多附件、批量导入、资料包 |
| 选择后立即上传 | pickAndUploadFile(options) / pickAndUploadFiles(options) |
页面只关心上传结果 |
| 按业务类型上传 | pickBusinessFiles(options) / pickAndUploadBusinessFiles(options) |
头像、图片、文档、Office、压缩包等常见场景 |
| 想直接使用内置 UI | <lizhao-choose-file ui-mode="business" /> |
希望少写页面代码,内置展示进度、数量和文件列表 |
| 页面已有自定义 UI | <lizhao-choose-file ui-mode="headless" /> 或纯 API |
只复用选择、上传、进度聚合和取消能力 |
从简单到复杂接入
1. 引入插件
API 调用统一从插件根目录引入:
import * as LizhaoChooseFile from '@/uni_modules/lizhao-choose-file'
组件通过 easycom 使用:
<template>
<lizhao-choose-file />
</template>
2. 选择单个文件
import * as LizhaoChooseFile from '@/uni_modules/lizhao-choose-file'
// 最小接入:只选择一个文件,不上传。
LizhaoChooseFile.pickFile({
accept: '*/*',
success(file) {
console.log('选择成功', file)
},
fail(err) {
console.log('选择失败', err)
}
})
3. 选择多个文件
import * as LizhaoChooseFile from '@/uni_modules/lizhao-choose-file'
// 多选适合附件、资料包等场景;maxCount 控制最多选择数量。
LizhaoChooseFile.pickFiles({
accept: '.pdf,.doc,.docx,.xls,.xlsx,image/*',
multiple: true,
maxCount: 5,
success(files) {
console.log('已选择文件', files)
}
})
4. 选择后自动上传
import * as LizhaoChooseFile from '@/uni_modules/lizhao-choose-file'
// 公开测试接口只适合联调,正式业务请替换为自己的上传地址。
const task = LizhaoChooseFile.pickAndUploadFiles({
accept: '.pdf,.doc,.docx,image/*',
multiple: true,
maxCount: 3,
upload: {
url: 'https://unidemo.dcloud.net.cn/upload',
name: 'file',
formData: {
scene: 'demo'
},
progress(progress) {
console.log('上传进度', progress.index + 1, progress.total, progress.progress)
},
success(res) {
console.log('上传成功', res)
},
fail(err) {
console.log('上传失败', err)
}
}
})
// 如需取消上传,保存 task 后调用 abort。
// task?.abort()
5. 使用业务场景预设
import * as LizhaoChooseFile from '@/uni_modules/lizhao-choose-file'
// document 场景会自动带上文档类 accept、默认多选和流程状态聚合。
LizhaoChooseFile.pickAndUploadBusinessFiles({
scene: 'document',
maxCount: 3,
upload: {
url: 'https://unidemo.dcloud.net.cn/upload',
name: 'file',
progress(progress) {
console.log('业务上传进度', progress.overallProgress)
}
},
stateChange(state) {
console.log('业务流程状态', state.status, state.selectedCount, state.uploadTotal)
}
})
6. 使用内置业务 UI
<template>
<lizhao-choose-file
scene="document"
mode="upload"
ui-mode="business"
:upload-url="uploadUrl"
upload-name="file"
title="业务资料上传"
description="支持 PDF、Word、Excel、图片和压缩包"
:show-progress="true"
:show-file-count="true"
:show-remove="true"
@success="onUploadSuccess"
@fail="onUploadFail"
@state-change="onUploadState"
/>
</template>
<script>
export default {
data() {
return {
// Web / H5 调试公开上传接口时,默认不要传自定义 header,避免 CORS 预检失败。
uploadUrl: 'https://unidemo.dcloud.net.cn/upload'
}
},
methods: {
onUploadSuccess(res) {
console.log('上传成功', res)
},
onUploadFail(err) {
console.log('上传失败', err)
},
onUploadState(state) {
console.log('上传状态', state)
}
}
}
</script>
7. 完全自定义 UI
<template>
<view>
<button @click="chooseContract">选择合同并上传</button>
<lizhao-choose-file
ref="contractUploader"
scene="document"
mode="upload"
ui-mode="headless"
:upload-url="uploadUrl"
upload-name="file"
@state-change="onUploadState"
/>
</view>
</template>
<script>
export default {
data() {
return {
uploadUrl: 'https://unidemo.dcloud.net.cn/upload'
}
},
methods: {
chooseContract() {
// headless 模式不渲染内置 UI,业务按钮通过组件方法触发流程。
this.$refs.contractUploader.choose()
},
onUploadState(state) {
console.log('自定义 UI 状态', state)
}
}
}
</script>
完整示例源码
完整页面源码已放在插件目录中,建议直接查看或复制:
E:\test\lizhao-plugin\uni_modules\lizhao-choose-file\example\index.vue
该示例页覆盖 DCloud / httpbin 测试接口切换、基础 API、业务封装 API、business / simple / headless 三种组件模式、上传进度、文件数量、删除文件、图片缩略图、点击预览和取消上传。图片文件会显示缩略图,点击后通过 uni.previewImage 浏览同批图片。
支持平台
| 平台 | 是否支持 | 说明 |
|---|---|---|
| uni-app | 是 | Vue2/Vue3 可用 |
| uni-app x | 是 | 多端可用 |
| Android | 是 | 使用系统文件选择器,上传前会把 content:// 文件复制到缓存目录 |
| iOS | 是 | 使用系统文件选择器,上传前会归一化 file:// 路径 |
| Harmony | 是 | 使用系统文件选择器,上传前会归一化系统选择器 URI |
| Web | 是 | 使用浏览器文件选择与上传能力 |
| 微信小程序 | 是 | 使用小程序文件选择与上传能力 |
| 支付宝小程序 | 是 | 使用小程序文件选择与上传能力 |
说明:所有 API 平台范围为 Android / iOS / Harmony / Web / 微信小程序 / 支付宝小程序。Harmony 端通过系统文件选择器返回 URI。file://media/Photo/...、file://docs... 等系统选择器 URI 会先通过 fs.openSync 打开授权文件,再复制到应用临时目录后上传;若 Harmony picker URI 无法复制到缓存/临时目录,会返回 9011011 明确错误,不会伪造成功。
API 总览
| 复杂度 | 能力 | API / 组件 |
|---|---|---|
| 1 | 单文件选择 | pickFile(options) |
| 2 | 多文件选择 | pickFiles(options) |
| 3 | 手动上传已选文件 | uploadFile(options) / uploadFiles(options) |
| 4 | 选择并自动上传 | pickAndUploadFile(options) / pickAndUploadFiles(options) |
| 5 | 业务场景选择 | pickBusinessFiles(options) |
| 6 | 业务场景选择并上传 | pickAndUploadBusinessFiles(options) |
| 7 | 内置业务 UI / headless 流程组件 | <lizhao-choose-file /> |
| 8 | 调试轨迹 | getDebugTrace() / clearDebugTrace() |
业务场景预设
业务封装 API 用于减少常见页面重复写 accept / maxCount / progress / count 状态管理。底层仍复用标准选择与上传 API,不改变平台实现。
| 场景 | 默认 accept | 默认多选 | 默认数量 | 说明 |
|---|---|---|---|---|
attachment |
*/* |
是 | 9 | 通用附件 |
avatar |
image/* |
否 | 1 | 头像或单图上传 |
image |
image/* |
是 | 9 | 图片选择或图片上传 |
document |
.pdf,.txt,.ofd |
是 | 9 | PDF、文本、OFD 文档 |
office |
.doc,.docx,.xls,.xlsx,.ppt,.pptx |
是 | 9 | Office 文件 |
media |
image/*,video/*,audio/* |
是 | 9 | 图片、视频、音频 |
archive |
.zip,.rar,.ofd,application/zip,application/vnd.rar,application/ofd |
是 | 9 | 压缩包与 OFD |
custom |
*/* |
是 | 9 | 优先使用业务传入的 accept |
pickBusinessFiles(options)
说明
按业务场景选择文件,并通过 stateChange 返回统一流程状态。
支持平台 Android / iOS / Harmony / Web / 微信小程序 / 支付宝小程序
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | BusinessPickFilesOptions | 是 | 业务选择参数对象 | 无 | scene / accept / multiple / maxCount / maxSize / filename / stateChange / success / fail / complete |
| options.scene | ChooseFileBusinessScene | 否 | 业务场景 | attachment |
attachment / avatar / image / document / office / media / archive / custom |
| options.accept | string | 否 | 自定义文件类型过滤规则,custom 场景优先使用 |
按场景预设 | 无 |
| options.multiple | boolean | 否 | 是否允许多选 | 按场景预设 | true / false |
| options.maxCount | number | 否 | 最大可选数量 | 按场景预设 | 无 |
| options.maxSize | number | 否 | 单文件最大体积,单位字节,0 表示不限制 | 0 |
无 |
| options.filename | string | 否 | 返回结果重命名模板 | 按场景预设 | 无 |
| options.stateChange | function | 否 | 流程状态变化回调 | 无 | 无 |
| options.success | function | 否 | 选择成功回调 | 无 | 无 |
| options.fail | function | 否 | 选择失败回调 | 无 | 无 |
| options.complete | function | 否 | 选择完成回调 | 无 | 无 |
pickAndUploadBusinessFiles(options)
说明
按业务场景选择文件并自动上传,stateChange 会聚合已选数量、当前上传序号、单文件进度、整体进度、成功数量和失败数量。
支持平台 Android / iOS / Harmony / Web / 微信小程序 / 支付宝小程序
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | BusinessPickAndUploadFilesOptions | 是 | 业务选择并上传参数对象 | 无 | scene / accept / multiple / maxCount / maxSize / filename / upload / stateChange / success / fail / complete |
| options.scene | ChooseFileBusinessScene | 否 | 业务场景 | attachment |
attachment / avatar / image / document / office / media / archive / custom |
| options.upload | UploadConfig | 是 | 上传配置 | 无 | url / name / header / formData / timeout / parseJson / successStatusCodes / sequential / stopOnFail / progress / success / fail / complete |
| options.stateChange | function | 否 | 流程状态变化回调 | 无 | 无 |
状态字段
| 字段 | 类型 | 说明 |
|---|---|---|
| status | ChooseFileFlowStatus | idle / picking / selected / uploading / success / fail / cancelled |
| selectedCount | number | 已选择文件数量 |
| uploadIndex | number | 当前上传序号,从 1 开始 |
| uploadTotal | number | 本轮上传文件总数 |
| currentProgress | number | 当前文件上传进度 |
| overallProgress | number | 整体上传进度 |
| successCount | number | 上传成功数量 |
| failCount | number | 上传失败数量 |
<lizhao-choose-file />
说明
可选业务组件,适合快速放到页面中触发选择或选择并上传。核心文件能力仍由 UTS API 提供,组件按 ui-mode 提供三种接入方式:business 使用内置业务上传 UI,simple 使用轻量按钮列表 UI,headless 不渲染内置 UI,仅通过组件方法和事件交给业务页面自定义。
属性
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| scene | string | 否 | 业务场景 | attachment |
attachment / avatar / image / document / office / media / archive / custom |
| file-type | string | 否 | 组件文件类型别名,合法值会优先覆盖 scene |
无 | attachment / avatar / image / document / office / media / archive / custom |
| mode | string | 否 | 工作模式 | pick |
pick / upload |
| ui-mode | string | 否 | 内置 UI 模式,business 为业务上传面板,simple 为轻量按钮列表,headless 不渲染内置 UI |
business |
business / simple / headless |
| accept | string | 否 | 自定义文件类型过滤,优先级最高 | 无 | 无 |
| extensions | array/string | 否 | 常用扩展名过滤,可传数组或逗号字符串 | [] |
例如 .pdf,.docx,.xlsx |
| mime-types | array/string | 否 | MIME 类型过滤,可传数组或逗号字符串 | [] |
例如 image/*,application/pdf |
| multiple | boolean | 否 | 是否允许多选 | true |
true / false |
| max-count | number | 否 | 最大选择数量 | 9 |
无 |
| max-size | number | 否 | 单文件最大体积,单位字节 | 0 |
无 |
| filename | string | 否 | 返回文件名模板,多选时底层会按现有规则追加序号 | 按场景预设 | 无 |
| upload-url | string | 否 | 上传服务器地址,mode=upload 时必填 |
无 | 无 |
| upload-name | string | 否 | multipart 文件字段名 | file |
无 |
| header | object | 否 | 上传请求头 | 无 | 无 |
| form-data | object | 否 | 上传表单字段 | 无 | 无 |
| timeout | number | 否 | 上传超时时间,单位毫秒 | 0 |
无 |
| parse-json | boolean | 否 | 是否把服务器响应字符串尝试解析到 parsedData |
false |
true / false |
| success-status-codes | array/string | 否 | 自定义成功 HTTP 状态码;为空时 200-299 均视为成功 | [] |
例如 200,201,204 |
| stop-on-fail | boolean | 否 | 多文件失败后是否停止 | true |
true / false |
| sequential | boolean | 否 | 多文件是否按顺序上传 | true |
true / false |
| show-progress | boolean | 否 | 是否显示上传进度条 | true |
true / false |
| show-file-count | boolean | 否 | 是否显示文件数量 | true |
true / false |
| show-selected-list | boolean | 否 | 是否显示已选文件列表 | true |
true / false |
| show-cancel | boolean | 否 | 是否显示取消上传按钮 | true |
true / false |
| show-remove | boolean | 否 | 是否显示文件删除入口,上传中不显示删除入口,避免 UI 列表和底层上传队列不一致 | true |
true / false |
| show-image-preview | boolean | 否 | 图片文件是否显示图片缩略图;非图片仍显示文件类型图标 | true |
true / false |
| preview-on-click | boolean | 否 | 点击图片缩略图时是否调用 uni.previewImage 预览同批图片 |
true |
true / false |
| button-text | string | 否 | 自定义按钮文案 | 按模式生成 | 无 |
| title | string | 否 | 自定义内置业务 UI 标题 | 按场景预设 | 无 |
| description | string | 否 | 自定义内置业务 UI 描述 | 按场景预设 | 无 |
| empty-text | string | 否 | 自定义空态标题 | 尚未选择文件 |
无 |
| empty-hint | string | 否 | 自定义空态说明 | 按标题描述生成 | 无 |
| remove-text | string | 否 | 删除文件按钮文案 | 删除 |
无 |
| confirm-remove | boolean | 否 | 删除前是否弹出确认框 | false |
true / false |
| confirm-remove-title | string | 否 | 删除确认框标题 | 删除文件 |
无 |
| confirm-remove-content | string | 否 | 删除确认框内容 | 确定删除该文件吗? |
无 |
| disabled | boolean | 否 | 是否禁用 | false |
true / false |
| busy-cooldown | number | 否 | 系统选择器忙碌时的点击保护时长,单位毫秒 | 1800 |
无 |
文件类型优先级:accept 明确传入时直接使用;否则组件会把 extensions 与 mime-types 合并为过滤条件;仍未配置时再使用 file-type 或 scene 对应的业务预设。
UI 模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
business |
渲染内置业务上传面板,包含场景图标、文件图标、文件名、文件大小、整体进度、当前文件进度、文件数量和取消按钮 | 想快速获得完整上传体验,不希望页面重复写业务 UI |
simple |
渲染轻量按钮、数量、进度条和简洁文件列表 | 只需要基础交互,页面已有自己的卡片或表单布局 |
headless |
不渲染内置 UI,组件只保留选择、上传、进度聚合、取消和事件能力 | 页面需要完全自定义视觉,但希望复用组件封装的流程状态 |
事件
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| @select | function | 否 | 文件选择成功时触发 |
| @progress | function | 否 | 上传进度变化时触发 |
| @success | function | 否 | 上传成功时触发 |
| @fail | function | 否 | 选择或上传失败时触发 |
| @complete | function | 否 | 选择或上传完成时触发 |
| @cancel | function | 否 | 用户取消选择或取消上传时触发 |
| @remove | function | 否 | 用户删除文件时触发,返回 { file, index, files, state },业务侧可在这里同步删除服务端临时文件 |
| @state-change | function | 否 | 统一流程状态变化时触发 |
方法
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| choose | function | 否 | 通过组件实例主动触发选择或选择并上传流程,适合 headless 模式自定义按钮调用 |
| open | function | 否 | choose 的语义化别名,便于兼容常见上传组件调用习惯 |
| abort | function | 否 | 取消当前上传任务,取消上传错误码为 9011010 |
| remove | function | 否 | 通过组件实例删除指定索引文件,等价于调用内置删除入口 |
| reset | function | 否 | 清空组件展示状态并触发一次 state-change |
pickFiles(options)
说明
选择多个文件。未配置 upload 时只返回文件选择结果;配置 upload 时选择成功后自动逐个上传。
支持平台 Android / iOS / Harmony / Web / 微信小程序 / 支付宝小程序
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | PickFilesOptions | 是 | 多文件选择参数对象 | 无 | accept / multiple / maxCount / maxSize / filename / upload / success / fail / complete |
| options.accept | string | 否 | 文件类型过滤规则,支持扩展名、MIME、image/*、*/* |
*/* |
无 |
| options.multiple | boolean | 否 | 是否允许多选 | false |
true / false |
| options.maxCount | number | 否 | 最大可选数量,单选固定按 1 处理 | 多选默认 9,单选默认 1 | 无 |
| options.maxSize | number | 否 | 单文件最大体积,单位字节,0 表示不限制 | 0 |
无 |
| options.filename | string | 否 | 返回结果重命名模板,多选时自动追加序号 | 无 | 无 |
| options.upload | UploadConfig | 否 | 选择成功后自动上传配置 | 无 | url / name / header / formData / timeout / parseJson / successStatusCodes / sequential / stopOnFail / progress / success / fail / complete |
| options.success | function | 否 | 选择成功回调,返回文件数组 | 无 | 无 |
| options.fail | function | 否 | 失败回调,返回统一错误对象 | 无 | 无 |
| options.complete | function | 否 | 完成回调,成功返回文件数组,失败返回错误对象 | 无 | 无 |
pickFile(options)
说明
选择单个文件。未配置 upload 时只返回文件选择结果;配置 upload 时选择成功后自动上传。
支持平台 Android / iOS / Harmony / Web / 微信小程序 / 支付宝小程序
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | PickFileOptions | 是 | 单文件选择参数对象 | 无 | accept / maxSize / filename / upload / success / fail / complete |
| options.accept | string | 否 | 文件类型过滤规则 | */* |
无 |
| options.maxSize | number | 否 | 单文件最大体积,单位字节,0 表示不限制 | 0 |
无 |
| options.filename | string | 否 | 返回结果重命名模板 | 无 | 无 |
| options.upload | UploadConfig | 否 | 选择成功后自动上传配置 | 无 | url / name / header / formData / timeout / parseJson / successStatusCodes / progress / success / fail / complete |
| options.success | function | 否 | 选择成功回调,返回单个文件对象 | 无 | 无 |
| options.fail | function | 否 | 失败回调,返回统一错误对象 | 无 | 无 |
| options.complete | function | 否 | 完成回调,成功返回文件对象,失败返回错误对象 | 无 | 无 |
uploadFile(options)
说明
手动上传单个已选择文件。上传方式为通用 HTTP multipart/form-data,服务器响应默认原样放入 data 字段;传 parseJson: true 时会额外尝试写入 parsedData。
支持平台 Android / iOS / Harmony / Web / 微信小程序 / 支付宝小程序
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | UploadFileOptions | 是 | 单文件上传参数对象 | 无 | file / url / name / header / formData / timeout / parseJson / successStatusCodes / success / fail / complete / progress |
| options.file | PickedFile | 是 | pickFile 或 pickFiles 返回的文件对象 |
无 | 无 |
| options.url | string | 是 | 上传服务器地址 | 无 | 无 |
| options.name | string | 否 | multipart 文件字段名 | file |
无 |
| options.header | UTSJSONObject | 否 | 请求头配置 | 无 | 无 |
| options.formData | UTSJSONObject | 否 | 表单附加字段 | 无 | 无 |
| options.timeout | number | 否 | 上传超时时间,单位毫秒,0 表示平台默认值 | 0 |
无 |
| options.parseJson | boolean | 否 | 是否把服务器响应字符串尝试解析到 parsedData;解析失败不影响 data 原文 |
false |
true / false |
| options.successStatusCodes | Array |
否 | 自定义成功 HTTP 状态码;为空时 200-299 均视为成功 | [] |
例如 [200, 201, 204] |
| options.success | function | 否 | 上传成功回调,返回 UploadSuccessItem |
无 | 无 |
| options.fail | function | 否 | 上传失败回调 | 无 | 无 |
| options.complete | function | 否 | 上传完成回调 | 无 | 无 |
| options.progress | function | 否 | 上传进度回调 | 无 | 无 |
uploadFiles(options)
说明
手动上传多个已选择文件。默认按顺序上传,失败后停止;传 sequential: false 时会并发上传,传 stopOnFail: false 时会在成功结果中额外返回 failResults 便于定位部分失败文件。
支持平台 Android / iOS / Harmony / Web / 微信小程序 / 支付宝小程序
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | UploadFilesOptions | 是 | 多文件上传参数对象 | 无 | files / url / name / header / formData / timeout / parseJson / successStatusCodes / sequential / stopOnFail / success / fail / complete / progress |
| options.files | Array |
是 | pickFiles 返回的文件数组 |
无 | 无 |
| options.url | string | 是 | 上传服务器地址 | 无 | 无 |
| options.name | string | 否 | multipart 文件字段名 | file |
无 |
| options.header | UTSJSONObject | 否 | 请求头配置 | 无 | 无 |
| options.formData | UTSJSONObject | 否 | 表单附加字段 | 无 | 无 |
| options.timeout | number | 否 | 上传超时时间,单位毫秒 | 0 |
无 |
| options.parseJson | boolean | 否 | 是否把服务器响应字符串尝试解析到 parsedData;解析失败不影响 data 原文 |
false |
true / false |
| options.successStatusCodes | Array |
否 | 自定义成功 HTTP 状态码;为空时 200-299 均视为成功 | [] |
例如 [200, 201, 204] |
| options.sequential | boolean | 否 | 是否逐个上传;传 false 会并发上传多个文件 |
true |
true / false |
| options.stopOnFail | boolean | 否 | 某个文件失败后是否停止后续上传 | true |
true / false |
| options.success | function | 否 | 全部上传成功回调,返回 UploadFilesResult |
无 | 无 |
| options.fail | function | 否 | 上传失败回调 | 无 | 无 |
| options.complete | function | 否 | 上传完成回调 | 无 | 无 |
| options.progress | function | 否 | 上传进度回调 | 无 | 无 |
pickAndUploadFile(options) / pickAndUploadFiles(options)
说明
先选择文件,再根据 options.upload 自动上传。选择成功回调仍返回原始文件对象或文件数组,上传成功回调通过 upload.success 返回。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.upload.url | string | 是 | 上传服务器地址 | 无 | 无 |
| options.upload.name | string | 否 | multipart 文件字段名 | file |
无 |
| options.upload.header | UTSJSONObject | 否 | 请求头配置 | 无 | 无 |
| options.upload.formData | UTSJSONObject | 否 | 表单附加字段 | 无 | 无 |
| options.upload.timeout | number | 否 | 上传超时时间,单位毫秒 | 0 |
无 |
| options.upload.parseJson | boolean | 否 | 是否把服务器响应字符串尝试解析到 parsedData |
false |
true / false |
| options.upload.successStatusCodes | Array |
否 | 自定义成功 HTTP 状态码;为空时 200-299 均视为成功 | [] |
例如 [200, 201, 204] |
| options.upload.progress | function | 否 | 上传进度回调 | 无 | 无 |
| options.upload.success | function | 否 | 上传成功回调 | 无 | 无 |
| options.upload.fail | function | 否 | 上传失败回调 | 无 | 无 |
| options.upload.complete | function | 否 | 上传完成回调 | 无 | 无 |
返回值说明
PickedFile
| 字段 | 类型 | 说明 |
|---|---|---|
| name | string | 文件名 |
| size | number | 文件大小,单位字节 |
| type | string | MIME 类型 |
| path | string | 可用于上传的文件路径或临时路径 |
| url | string | 与 path 保持一致的兼容字段 |
| lastModified | number | 最后修改时间,平台不支持时为 0 |
| source | string | 文件来源平台标识 |
| ext | string | 文件扩展名 |
UploadSuccessItem
| 字段 | 类型 | 说明 |
|---|---|---|
| file | PickedFile | 本次上传的文件对象 |
| index | number | 文件在本批次中的下标,单文件固定为 0 |
| statusCode | number | HTTP 状态码 |
| data | string | 服务器原始响应字符串 |
| parsedData | any/null | 开启 parseJson 且解析成功时返回 JSON 对象或数组,否则为 null |
| header | any | 响应头信息,平台不返回时为 null |
UploadFilesResult
| 字段 | 类型 | 说明 |
|---|---|---|
| files | Array |
本批次上传的文件数组 |
| results | Array |
每个成功上传文件的服务器返回 |
| failResults | Array |
stopOnFail: false 或部分失败场景下的失败明细,包含 file / index / error |
| successCount | number | 上传成功数量 |
| failCount | number | 上传失败数量 |
错误码
| 错误码 | 含义 | 说明 |
|---|---|---|
| 9011001 | platform unsupported | 当前平台不支持 |
| 9011002 | user cancelled | 用户取消选择 |
| 9011003 | permission denied | 平台权限不足 |
| 9011004 | count exceeded | 选择数量超过 maxCount |
| 9011005 | invalid file type | 文件类型不符合 accept |
| 9011006 | file size exceeded | 文件超过 maxSize 限制 |
| 9011007 | system error | 平台选择器异常或返回结构异常 |
| 9011008 | invalid upload options | 上传参数错误,例如 url 为空或文件路径为空 |
| 9011009 | upload failed | 上传失败,例如网络错误或 HTTP 非 2xx |
| 9011010 | upload aborted | 上传任务已取消 |
| 9011011 | upload file path convert failed | 上传前文件路径转换失败,例如 Android content:// 或 Harmony picker URI 无法复制到缓存/临时目录 |
示例
前面已经给出从简单到复杂的接入路径。这里保留常用扩展片段,完整页面结构、样式、错误提示、接口切换、取消上传和回调日志请看插件目录中的完整示例。
uni-app 调用示例
import * as LizhaoChooseFile from '@/uni_modules/lizhao-choose-file'
// uni-app 页面中可以直接在 methods 或组合式函数里调用。
LizhaoChooseFile.pickFile({
accept: '*/*',
success(file) {
console.log('uni-app 选择成功', file)
}
})
uni-app x 调用示例
import * as LizhaoChooseFile from '@/uni_modules/lizhao-choose-file'
// uni-app x 调用路径一致;App 端如新增业务 API 后旧基座未联编,请参考“自定义基座说明”。
LizhaoChooseFile.pickFiles({
accept: 'image/*',
multiple: true,
maxCount: 3,
success(files) {
console.log('uni-app x 选择成功', files)
}
})
手动上传示例
import * as LizhaoChooseFile from '@/uni_modules/lizhao-choose-file'
// 手动上传适合“先选文件、表单确认后再上传”的业务流程。
LizhaoChooseFile.pickFiles({
accept: '.pdf,.doc,.docx,image/*',
multiple: true,
maxCount: 3,
success(files) {
const task = LizhaoChooseFile.uploadFiles({
files,
url: 'https://unidemo.dcloud.net.cn/upload',
name: 'file',
// 开启并发上传;如需严格按顺序上传,可改回 sequential: true。
sequential: false,
// 允许部分文件失败后继续上传,最终通过 failResults 定位失败文件。
stopOnFail: false,
// 测试接口返回 JSON 字符串时,插件会额外写入 parsedData,data 仍保留原文。
parseJson: true,
successStatusCodes: [200, 201, 204],
progress(progress) {
console.log('上传进度', progress.index + 1, progress.total, progress.progress)
},
success(res) {
console.log('手动上传成功', res)
console.log('失败明细', res.failResults)
},
fail(err) {
console.log('手动上传失败', err)
}
})
// 如需取消上传,保存 task 后调用 abort。
// task?.abort()
}
})
完整上传测试页面示例
完整页面源码已放在插件目录中,建议直接查看或复制:
E:\test\lizhao-plugin\uni_modules\lizhao-choose-file\example\index.vue
该示例页覆盖以下链路:
- 上传接口切换:DCloud 测试接口、httpbin 回显接口、空 URL 错误测试。
- 基础 API:pickFile / pickFiles / uploadFiles / pickAndUploadFiles。
- 业务封装 API:pickAndUploadBusinessFiles。
- 可选业务组件:
,包含 business / simple / headless 三种 UI 模式、上传进度、文件数量、删除文件、图片缩略图、点击预览、取消上传等能力。
业务场景封装 API 示例
import * as LizhaoChooseFile from '@/uni_modules/lizhao-choose-file'
// 业务附件上传:插件会按 attachment 场景生成默认 accept、数量和文件名模板。
const task = LizhaoChooseFile.pickAndUploadBusinessFiles({
scene: 'attachment',
maxCount: 3,
upload: {
url: 'https://unidemo.dcloud.net.cn/upload',
name: 'file',
parseJson: true,
successStatusCodes: [200, 201, 204],
progress(progress) {
console.log('业务上传进度', progress.index + 1, progress.total, progress.progress)
}
},
stateChange(state) {
console.log('业务流程状态', state.status, state.selectedCount, state.uploadTotal, state.overallProgress)
}
})
// task?.abort()
业务组件示例:business 内置业务 UI
<template>
<lizhao-choose-file
scene="document"
file-type="document"
mode="upload"
ui-mode="business"
:extensions="['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.txt', '.ofd']"
:upload-url="uploadUrl"
upload-name="file"
:parse-json="true"
:success-status-codes="[200, 201, 204]"
:show-progress="true"
:show-file-count="true"
:show-selected-list="true"
:show-remove="true"
:confirm-remove="true"
title="业务资料上传"
description="支持合同、表格、PDF 与 OFD,可删除后重新选择"
empty-text="还没有业务资料"
remove-text="删除"
@state-change="onChooseFileState"
@success="onChooseFileSuccess"
@fail="onChooseFileFail"
@remove="onChooseFileRemove"
/>
</template>
业务组件示例:simple 轻量 UI
<template>
<lizhao-choose-file
scene="image"
mode="pick"
ui-mode="simple"
:max-count="6"
button-text="选择图片"
:show-progress="false"
:show-file-count="true"
:show-selected-list="true"
:show-image-preview="true"
:preview-on-click="true"
@select="onImageSelect"
@preview="onImagePreview"
/>
</template>
图片场景默认开启缩略图展示。若传入 preview-on-click="true",点击缩略图会调用 uni.previewImage,组件也会触发 preview 事件,便于业务记录日志或埋点。
业务组件示例:headless 自定义 UI
<template>
<view class="custom-upload">
<button @click="chooseContract">选择合同并上传</button>
<lizhao-choose-file
ref="contractUploader"
scene="document"
mode="upload"
ui-mode="headless"
:upload-url="uploadUrl"
upload-name="file"
:parse-json="true"
:show-progress="false"
:show-file-count="false"
@state-change="onContractUploadState"
/>
</view>
</template>
<script>
export default {
data() {
return {
uploadUrl: 'https://unidemo.dcloud.net.cn/upload'
}
},
methods: {
chooseContract() {
// headless 模式不渲染内置 UI,业务按钮通过 ref 调用 choose。
this.$refs.contractUploader.choose()
},
onContractUploadState(state) {
console.log('自定义上传状态', state)
}
}
}
</script>
权限说明
- 文件选择使用平台系统选择器,通常无需额外申请存储权限。
- Android 上传
content://文件时会临时复制到应用缓存目录,不会写入公共存储。 - 上传能力需要网络访问权限,业务侧需确保服务器地址、域名白名单、小程序后台配置等已正确设置。
自定义基座说明
本插件未引入三方原生 SDK,默认不需要自定义基座。若业务侧后续自行加入原生网络 SDK 或额外权限配置,需要重新制作自定义基座。
本次业务封装新增了根 utssdk/index.uts 导出和 interface.uts 类型声明,App 端如果已经安装旧自定义基座,需要重新运行原生联编或重新制作对应平台自定义基座后,才能直接调用 pickBusinessFiles / pickAndUploadBusinessFiles。可选 <lizhao-choose-file /> 组件和示例页已内置旧基座兼容兜底:当当前运行包尚未暴露业务 API 代理时,会退回已稳定暴露的 pickFiles + uploadFiles 组合,继续展示进度条、文件数量、文件列表和取消上传状态。
可测试上传接口
示例页默认使用已验证可上传的 DCloud 测试接口。公开接口仅适合插件联调,不建议用于线上业务。
| 接口 | 用途 | 返回特点 |
|---|---|---|
https://unidemo.dcloud.net.cn/upload |
DCloud 官方示例上传接口 | 返回字符串 data 中包含 strings 和 files |
https://httpbin.org/post |
multipart 回显接口 | 返回字符串 data 中包含 form、files 和 headers |
测试建议:
| 场景 | 操作 | 预期 |
|---|---|---|
| 正常上传 | 使用 DCloud 测试接口选择文件上传 | success 返回 statusCode=200,data 为服务器原始字符串 |
| 表单回显 | 使用 httpbin 接口上传并传 parseJson: true |
data 中可看到原始字符串,parsedData 中可直接读取 form / files / headers |
| 并发上传 | 调用 uploadFiles 时传 sequential: false |
多个文件同时开始上传,进度回调中的 index 仍对应原始文件下标 |
| 部分失败 | 调用 uploadFiles 时传 stopOnFail: false |
success 返回 failResults,可按 index / file / error 定位失败文件 |
| 参数错误 | 将 url 置空后上传 |
fail 返回 9011008 |
| 取消上传 | 上传过程中调用 abort() |
fail 返回 9011010 |
| 非 2xx | 使用返回 404/500 的业务接口上传 | fail 返回 9011009 |
小程序端使用公开测试接口前,需要先在小程序后台配置合法域名;正式业务请替换为自己的服务端接口。
注意事项
- 上传目标只支持通用 HTTP 服务器,不内置 uniCloud 上传。
method固定为POST,底层按平台上传 API 的multipart/form-data语义执行。name默认值为file,如果后端使用其他字段名,请通过options.name或upload.name指定。header和formData都是普通对象;不要把 token、密钥、账号等敏感信息写死在示例代码或仓库中。- 发布版运行日志会保留中文阶段、错误码、文件名与来源平台,但不会输出完整上传 URL、本地路径、临时路径或 picker URI;业务侧需要完整链路信息时,请在自己的回调里按需记录。
accept支持扩展名与 MIME;对于application/zip、application/x-rar-compressed、application/vnd.rar、application/ofd、application/x-ofd等常见归档/OFD 类型,平台未返回 MIME 时会按扩展名兜底校验,避免误报9011005。- Web / H5 调试公开上传接口时,默认不要传
X-Demo等自定义请求头;部分公开接口不会在 CORS 预检响应中允许这些 header,浏览器会直接拦截上传。 - 服务器响应默认不会自动 JSON 解析;需要结构化响应时传
parseJson: true,插件会把解析成功的结果放入UploadSuccessItem.parsedData,同时保留data原文。 - 上传默认以 HTTP 200-299 视为成功;后端使用 201、204 或其他固定成功码时,可通过
successStatusCodes明确指定,传空数组则保持默认 2xx 规则。 - 多文件默认逐个上传,失败后停止;如需并发上传可传
sequential: false,如需跳过失败继续上传可传stopOnFail: false,最终通过UploadFilesResult.failResults查看失败明细。 progress是持续回调,App 与小程序上传入口已按 UTS 要求使用@UTSJS.keepAlive保活;Web / H5 端不能使用该装饰器,否则 Vite/esbuild 会报Decorators are not valid here。- Android 选择到
content://文件时,插件会先复制到应用缓存目录再上传;如果复制失败会返回9011011。 - iOS 选择到
file://路径时,插件会去掉前缀并做decodeURI后再上传。 - Harmony 选择到
file://media/Photo/...、file://docs...等系统 URI 时,插件会先打开授权文件并复制到应用临时目录再上传;如果复制失败会返回9011011。 - 示例中的公开测试接口只用于联调,不建议作为线上业务接口。
作者系列UTS插件
以下为已在 DCloud 插件市场上架的作者系列 UTS 插件,可按业务场景组合使用。未列出的插件表示当前未确认公开市场页,后续上架后再补充。
| 插件 | 能力方向 | 插件市场 |
|---|---|---|
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 | 查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 | 查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 | 查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 | 查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 | 查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 | 查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 | 查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 | 查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 | 查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 | 查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 | 查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6484
赞赏 5
下载 12286089
赞赏 1922
赞赏
京公网安备:11010802035340号