更新记录

1.0.0(2026-08-11)

  • 首发 x-filepick
  • Android SAF + iOS UIDocumentPicker
  • 多选 / preset / copyToCache / persistPermission
  • 对标 sn-uts-file 并补齐双端与元数据

平台兼容性

uni-app

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × × × × × × × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(4.27)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 5.0 14 × ×

x-filepick

uni-app x 零权限系统文件选择 UTS 插件(Android + iOS)。

对标 sn-uts-file #14309 的「系统选择器 + 零权限」思路,并按业界高星方案补齐双端、多选、元数据与本地副本。

相对 #14309 的差异

能力 sn-uts-file (14309) x-filepick
平台 仅 Android Android + iOS
API pickerFile(mime, cb) Options:success / fail / complete
多选 multiple + count
过滤 单 MIME preset + mimeTypes + extensions
返回 偏 path name / size / mime / ext / uri / path
本地副本 隐式/有限 copyToCache(对齐 RN keepLocalCopy)
持久 URI Android persistPermission
辅助 getPickedFileInfo / toUploadFile / isSupported

通用架构(调研结论)

详见 RESEARCH.md。核心共识:

  1. AndroidACTION_OPEN_DOCUMENT(SAF)优于自建文件浏览器;零存储权限
  2. iOSUIDocumentPickerViewController(asCopy: true)
  3. content:// / 临时 URL 不可长期持有 → 默认复制到应用 cache,返回 pathuni.uploadFile / FFmpeg 等使用

高星参考:react-native-documents/document-picker ~1505⭐rosuH/AndroidFilePicker ~1068⭐(后者为自建 UI,本插件刻意不采用)。

安装

放入 uni_modules/x-filepick制作自定义调试基座后运行。

API

chooseFile(options)

import { chooseFile } from '@/uni_modules/x-filepick'

chooseFile({
  preset: 'video',          // all | image | video | audio | pdf | doc
  // mimeTypes: ['application/pdf'],
  // extensions: ['mp4', 'mov'],
  multiple: false,
  count: 9,
  copyToCache: true,
  persistPermission: false, // Android only
  success(res) {
    console.log(res.count, res.files[0].path, res.files[0].uri)
  },
  fail(err) {
    console.log(err.errCode, err.errMsg) // 9040001 = 用户取消
  }
})

getPickedFileInfo / toUploadFile / isSupported / getPluginVersion

utssdk/interface.uts

错误码(904xxxx)

code 含义
9040001 用户取消
9040002 选择失败
9040003 平台不支持(Web)
9040004 参数非法
9040005 复制/解析失败

权限与隐私

  • 不申请 READ_EXTERNAL_STORAGE / READ_MEDIA_* / 相册权限
  • 仅访问用户在系统选择器中主动选中的文件
  • 不上传、不采集

注意

  1. 改过 Kotlin/Swift 后需重新制作自定义基座
  2. 系统文件管理器对 MIME 过滤因 ROM 而异;extensions 会在结果侧再过滤
  3. uri(尤其 Android content://)为临时引用;上传/转码请用 copyToCache: true 得到的 path
  4. 可与本仓库 x-ffmpeg 配合:选视频 → path → 压缩/截帧

许可

业务代码随项目;无第三方运行时依赖(仅系统 API)。

隐私、权限声明

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

无。默认不申请存储/相册权限。Android 使用 SAF;iOS 使用 UIDocumentPicker。

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

插件不采集任何数据。仅访问用户主动在系统选择器中选中的文件,不上传服务器。

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

暂无用户评论。