更新记录

1.2.10(2026-06-17)

  • 复修 iOS 云打包 unable to type-check this expression in reasonable timelaunchIosPicker 主线程闭包拆为 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-jsonsuccess-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 明确传入时直接使用;否则组件会把 extensionsmime-types 合并为过滤条件;仍未配置时再使用 file-typescene 对应的业务预设。

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 pickFilepickFiles 返回的文件对象
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 中包含 stringsfiles
https://httpbin.org/post multipart 回显接口 返回字符串 data 中包含 formfilesheaders

测试建议:

场景 操作 预期
正常上传 使用 DCloud 测试接口选择文件上传 success 返回 statusCode=200data 为服务器原始字符串
表单回显 使用 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.nameupload.name 指定。
  • headerformData 都是普通对象;不要把 token、密钥、账号等敏感信息写死在示例代码或仓库中。
  • 发布版运行日志会保留中文阶段、错误码、文件名与来源平台,但不会输出完整上传 URL、本地路径、临时路径或 picker URI;业务侧需要完整链路信息时,请在自己的回调里按需记录。
  • accept 支持扩展名与 MIME;对于 application/zipapplication/x-rar-compressedapplication/vnd.rarapplication/ofdapplication/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 模拟器环境检测、风险评分与证据 查看插件

隐私、权限声明

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

按平台系统文件选择器规则

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

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