@sphinxvon/file-upload-component
Version:
一个支持分片上传、断点续传和批量上传的文件上传组件
325 lines (262 loc) • 7.41 kB
Markdown
3和Element Plus,也可适配其他UI框架
- 支持自定义上传API地址
使用npm:
```bash
npm install @sphinxvon/file-upload-component --save
```
1. 确保代码已提交并推送至远程仓库
2. 更新package.json中的版本号
3. 运行构建命令:
```bash
npm run build
```
4. 登录npm账户:
```bash
npm login
```
5. 发布到npm:
```bash
npm publish
```
```vue
<template>
<FileUpload
:base-url="apiBaseUrl"
@progress="handleProgress"
@success="handleSuccess"
@error="handleError"
/>
</template>
<script setup>
import { FileUpload } from '@sphinxvon/file-upload-component';
const apiBaseUrl = 'http://localhost:8080';
function handleProgress(progress) {
console.log('上传进度:', progress);
}
function handleSuccess(data) {
console.log('上传成功:', data);
}
function handleError(error) {
console.log('上传出错:', error);
}
</script>
```
```vue
<template>
<FileUpload
:base-url="apiBaseUrl"
:chunk-size="2"
:concurrency="5"
:max-file-size="100"
:timeout="60"
:tips="'请上传小于100MB的文件'"
:drag="true"
@progress="handleProgress"
@success="handleSuccess"
@error="handleError"
@complete="handleComplete"
@pause="handlePause"
@resume="handleResume"
@cancel="handleCancel"
/>
</template>
<script setup>
import { FileUpload } from '@sphinxvon/file-upload-component';
const apiBaseUrl = 'http://localhost:8080';
// 事件处理函数
function handleProgress(progress) {
console.log('上传进度:', progress);
}
function handleSuccess(data) {
console.log('上传成功:', data);
}
function handleError(error) {
console.log('上传出错:', error);
}
function handleComplete(data) {
console.log('上传完成:', data);
}
function handlePause(data) {
console.log('上传暂停:', data);
}
function handleResume(data) {
console.log('上传恢复:', data);
}
function handleCancel(data) {
console.log('上传取消:', data);
}
</script>
```
```javascript
import { FileUploader } from '@sphinxvon/file-upload-component';
// 创建上传器实例
const uploader = new FileUploader({
baseUrl: 'http://localhost:8080',
chunkSize: 5 * 1024 * 1024, // 5MB
concurrency: 3
});
// 监听事件
uploader.on('progress', (progress) => {
console.log('上传进度:', progress);
});
uploader.on('success', (data) => {
console.log('上传成功:', data);
});
uploader.on('error', (error) => {
console.log('上传出错:', error);
});
// 批量上传文件
const fileInput = document.getElementById('fileInput');
uploader.batchUpload(fileInput.files);
```
| 属性名 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| baseUrl | String | 'http://localhost:8080' | API基础URL |
| chunkSize | Number | 5 | 分片大小(MB) |
| concurrency | Number | 3 | 并发上传数 |
| maxFileSize | Number | 100 | 最大文件大小(MB) |
| timeout | Number | 30 | 超时时间(秒) |
| tips | String | '请上传不超过100MB的文件' | 上传提示文案 |
| drag | Boolean | true | 是否启用拖拽上传 |
| 事件名 | 参数 | 说明 |
| --- | --- | --- |
| progress | Object | 上传进度信息 |
| success | Object | 上传成功回调 |
| error | Object | 上传出错回调 |
| complete | Object | 上传完成回调 |
| pause | Object | 上传暂停回调 |
| resume | Object | 上传恢复回调 |
| cancel | Object | 上传取消回调 |
```javascript
import { FileUploader } from '@sphinxvon/file-upload-component';
```
```javascript
const uploader = new FileUploader(options);
```
**参数:**
- `options` {Object} - 配置选项
- `baseUrl` {String} - API基础URL
- `chunkSize` {Number} - 分片大小(字节)
- `concurrency` {Number} - 并发上传数
- `timeout` {Number} - 超时时间(毫秒)
| 方法名 | 参数 | 返回值 | 说明 |
| --- | --- | --- | --- |
| on(event, callback) | event {String}, callback {Function} | - | 设置事件回调 |
| addFile(file) | file {File} | String | 添加文件到上传队列 |
| startUpload(fileId) | fileId {String} | Promise | 开始上传文件 |
| pauseUpload(fileId) | fileId {String} | - | 暂停上传 |
| resumeUpload(fileId) | fileId {String} | - | 恢复上传 |
| cancelUpload(fileId) | fileId {String} | Promise | 取消上传 |
| batchUpload(files) | files {FileList\|Array<File>} | Array<String> | 批量上传文件 |
| getTaskProgress(fileId) | fileId {String} | Object | 获取任务进度信息 |
| getAllTaskProgress() | - | Array<Object> | 获取所有任务进度信息 |
| getOptions() | - | Object | 获取上传选项 |
| updateOptions(options) | options {Object} | - | 更新上传选项 |
组件需要后端提供以下API接口支持:
**URL:** `/file/initMultipart`
**方法:** `POST`
**参数:**
- `fileId` {String} - 文件唯一标识
- `fileName` {String} - 文件名
- `fileSize` {Number} - 文件大小(字节)
- `contentType` {String} - 文件MIME类型
- `md5` {String} - 文件MD5值
**响应:**
```json
{
"code": 200,
"data": {
"taskId": "任务ID",
"totalChunks": 10, // 总分片数
"uploadedChunks": 0 // 已上传分片数
},
"msg": "成功"
}
```
**URL:** `/file/uploadChunk`
**方法:** `POST`
**参数:**
- `taskId` {String} - 上传任务ID
- `chunkIndex` {Number} - 分片索引
- `file` {File} - 分片文件
**响应:**
```json
{
"code": 200,
"data": {},
"msg": "成功"
}
```
**URL:** `/file/mergeChunks`
**方法:** `POST`
**参数:**
- `taskId` {String} - 上传任务ID
- `fileId` {String} - 文件唯一标识
- `fileName` {String} - 文件名
- `fileSize` {Number} - 文件大小(字节)
- `md5` {String} - 文件MD5值
**响应:**
```json
{
"code": 200,
"data": {
"url": "文件访问地址"
},
"msg": "成功"
}
```
**URL:** `/file/progress`
**方法:** `GET`
**参数:**
- `fileId` {String} - 文件唯一标识
**响应:**
```json
{
"code": 200,
"data": {
"uploadedChunks": 5,
"totalChunks": 10
},
"msg": "成功"
}
```
**URL:** `/file/cancel`
**方法:** `POST`
**参数:**
- `taskId` {String} - 上传任务ID
**响应:**
```json
{
"code": 200,
"data": {},
"msg": "成功"
}
```
一个功能强大的文件上传组件,支持分片上传、断点续传、批量上传和MD5校验,适用于大文件上传场景。组件核心逻辑与UI分离,可灵活适配不同的UI框架。
- 支持分片上传,可配置分片大小
- 断点续传,支持暂停/继续上传
- 文件MD5校验,避免重复上传
- 批量上传功能
- 并发上传控制
- 实时上传进度显示
- 核心逻辑与UI分离,易于扩展和定制
- 基于Vue