更新记录
1.0.1(2026-06-17) 下载此版本
增加内置demo
1.0.0(2026-06-17) 下载此版本
- 初始版本发布
- 支持文件分片上传
- 支持断点续传(需配置 checkApi)
- 支持秒传(服务端返回 uploaded: true)
- 支持并发控制(concurrency 参数)
- 支持失败自动重试(retryCount + retryDelay 参数)
- 支持暂停/继续/取消
- 支持实时进度展示
- 支持图片缩略图预览
- 支持自定义触发器插槽(trigger slot)
- 支持外部文件列表回显(value prop)
- 提供 JS 工具类 SliceUploader,可脱离 UI 组件独立使用
- 所有接口字段名均可配置,适配不同后端规范
平台兼容性
uni-app(5.0)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | - | √ | √ | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | - | √ | √ | - | - | - |
snail-upload-slice
UniApp 文件分片上传组件,支持分片上传、断点续传、进度展示、秒传、并发控制、失败重试,参数高度可配置。
功能特性
- 分片上传:将大文件切割为多个分片依次或并发上传
- 断点续传:上传前通过
checkApi检测已上传分片,跳过已完成部分 - 秒传:服务端返回
{ uploaded: true }时直接完成,无需重复上传 - 并发控制:
concurrency控制同时上传分片数,防止占用过多带宽 - 失败重试:分片失败后自动重试,支持自定义重试次数和间隔
- 暂停/继续:随时暂停并从断点恢复
- 进度展示:实时百分比进度条 + 状态文字
- 文件预览:图片显示缩略图,其他类型显示文件图标
- 自定义插槽:通过
trigger插槽替换默认上传按钮
快速开始
查看示例页面
插件内置了完整的示例页面,帮助你快速上手:
- 在 HBuilderX 中导入插件后
- 将
uni_modules/snail-upload-slice/pages/demo目录复制到你的项目pages目录下 - 在
pages.json中添加页面配置:{ "path": "pages/demo/index", "style": { "navigationBarTitleText": "上传组件演示" } } - 运行项目即可查看完整示例
示例页面包含:
- ✅ 基础自动上传示例
- ✅ 手动上传图片示例
- ✅ 自定义触发器示例
- ✅ 实时事件日志展示
- ✅ 服务器地址动态配置
使用说明
组件遵循 easycom 规范,导入插件后无需手动引入,直接使用即可。
<snail-upload-slice
upload-api="https://your-server.com/api/upload/chunk"
check-api="https://your-server.com/api/upload/check"
merge-api="https://your-server.com/api/upload/merge"
:chunk-size="2 * 1024 * 1024"
:concurrency="3"
:retry-count="3"
accept="all"
:max-count="9"
:max-size="100 * 1024 * 1024"
:auto-upload="true"
:show-progress="true"
tip="支持任意格式,单文件不超过100MB"
@success="onSuccess"
@error="onError"
@progress=""
@change="onChange"
/>
Props 参数
API 配置
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| upload-api | String | '' |
必填,分片上传接口地址(POST) |
| check-api | String | '' |
可选,断点续传校验接口(GET) |
| merge-api | String | '' |
可选,合并分片接口(POST) |
上传配置
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| chunk-size | Number | 2097152(2MB) |
每个分片的大小,单位 byte |
| concurrency | Number | 3 |
并发上传分片数 |
| retry-count | Number | 3 |
分片失败后最大重试次数 |
| retry-delay | Number | 1000 |
重试间隔,单位 ms |
| headers | Object | {} |
自定义请求头,如 Authorization |
| data | Object | {} |
附加到每次请求的 formData 字段 |
字段名配置
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| chunk-field | String | 'chunk' |
分片文件字段名 |
| chunk-index-field | String | 'chunkIndex' |
分片索引字段名 |
| chunk-total-field | String | 'chunkTotal' |
总片数字段名 |
| file-hash-field | String | 'fileHash' |
文件唯一标识字段名 |
| file-name-field | String | 'fileName' |
文件名字段名 |
| file-size-field | String | 'fileSize' |
文件大小字段名 |
文件选择配置
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| accept | String | 'all' |
文件类型:image / video / all |
| max-count | Number | 9 |
最多可选文件数量 |
| max-size | Number | 0 |
单文件最大 size(byte),0 表示不限制 |
| disabled | Boolean | false |
是否禁用 |
| auto-upload | Boolean | true |
是否选择后自动上传 |
| allow-cancel-uploading | Boolean | true |
是否允许取消上传中的文件 |
UI 配置
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| btn-text | String | '选择文件' |
默认上传按钮文字 |
| show-file-list | Boolean | true |
是否显示文件列表 |
| show-progress | Boolean | true |
是否显示进度条 |
| tip | String | '' |
底部提示文字 |
| value | Array | [] |
外部传入的已有文件列表(回显) |
Events 事件
| 事件名 | 参数 | 说明 |
|---|---|---|
| success | { file, response } |
单文件上传成功 |
| error | { file, error } |
单文件上传失败 |
| progress | { file, progress, status } |
上传进度变化 |
| status-change | { file, status } |
文件状态变化 |
| change | fileList |
成功文件列表变化(v-model) |
| choose | files |
文件选择完成 |
| pause | { file } |
文件暂停 |
| resume | { file } |
文件继续上传 |
| retry | { file } |
文件重试 |
| remove | { file, index } |
文件移除 |
| exceed | { maxCount } |
超出最大数量限制 |
| size-exceed | file |
超出最大 size 限制 |
Methods 方法
通过 ref 调用组件实例方法:
| 方法名 | 说明 |
|---|---|
submit() |
手动触发上传(auto-upload=false 时使用) |
getFileList() |
获取当前文件列表 |
clearFiles() |
清空所有文件(会取消上传中的文件) |
插槽 Slots
| 插槽名 | 说明 |
|---|---|
trigger |
自定义上传触发区域,替换默认 + 按钮 |
服务端接口规范
checkApi(GET)
请求参数:
fileHash=xxx&fileName=xxx&fileSize=xxx
响应示例(秒传):
{ "code": 0, "uploaded": true, "url": "https://cdn.example.com/file.zip" }
响应示例(断点续传):
{ "code": 0, "uploaded": false, "uploadedChunks": [0, 1, 2] }
uploadApi(POST,multipart/form-data)
请求字段:
chunk:分片文件二进制chunkIndex:当前分片索引(从 0 开始)chunkTotal:总分片数fileHash:文件唯一标识fileName:原始文件名fileSize:文件总大小
响应示例:
{ "code": 0, "msg": "ok" }
mergeApi(POST,application/json)
请求体:
{ "fileHash": "xxx", "fileName": "xxx.zip", "fileSize": 1024000, "chunkTotal": 5 }
响应示例:
{ "code": 0, "msg": "合并成功", "url": "https://cdn.example.com/xxx.zip" }
直接使用 JS 工具类
import { SliceUploader, UPLOAD_STATUS } from '@/uni_modules/snail-upload-slice/js_sdk/upload-slice.js'
const uploader = new SliceUploader({
uploadApi: 'https://your-server.com/api/upload/chunk',
checkApi: 'https://your-server.com/api/upload/check',
mergeApi: 'https://your-server.com/api/upload/merge',
chunkSize: 2 * 1024 * 1024,
concurrency: 3,
retryCount: 3,
})
uploader
.on('progress', ({ progress }) => console.log('进度:', progress))
.on('success', ({ data }) => console.log('成功:', data))
.on('error', ({ error }) => console.error('失败:', error))
// 开始上传(file 为 uni.chooseFile 返回的 tempFiles[0])
uploader.start(file)
// 暂停
uploader.pause()
// 继续
uploader.resume()
// 取消
uploader.cancel()

收藏人数:
github:your-name/snail-upload-slice
下载插件并导入HBuilderX
赞赏(0)
下载 0
赞赏 0
下载 12277918
赞赏 1922
赞赏
京公网安备:11010802035340号