# G3File 文件管理组件
## 概述
G3File 是一个基于 jQuery 的文件管理组件,提供文件上传、预览、下载、删除等功能,支持阿里云 OSS 上传和自定义上传。
## 文件结构
```
g3-file/
├── index.js # 主组件代码
├── index.css # 样式文件
├── common.js # 工具函数
├── icon.js # 图标定义
├── language.js # 语言配置
└── libs/ # 第三方依赖
├── FileSaver.min.js
└── jszip.min.js
```
## 快速开始
### 引入依赖
```html
```
### 初始化组件
```javascript
var file = $('#fileContainer').G3File({
data: [
{
name: 'example.pdf',
size: 1024000,
uploadDate: '2024-01-15T10:30:00',
url: 'http://example.com/example.pdf'
}
],
previewUrl: 'https://preview.example.com?url=',
onUploadSuccess: function(file) {
console.log('上传成功:', file);
}
});
```
## 配置选项
### 基础配置
| 配置项 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `data` | Array | `[]` | 初始化时的文件数据 |
| `mode` | String | `'aliyun'` | 上传模式 |
| `language` | String | `'zh-CN'` | 语言(zh-CN/en/ru) |
| `maxFileSize` | Number | `10485760` | 最大文件大小(字节) |
| `previewUrl` | String | `''` | 文件预览服务地址 |
### 回调函数
| 配置项 | 参数 | 说明 |
|--------|------|------|
| `onDeleteBefore` | `files` | 删除前回调,返回 false/Promise/Function 可阻止删除 |
| `onDelete` | `files` | 删除后回调 |
| `onDownload` | `files` | 下载回调 |
| `onSelect` | `files` | 文件选中回调 |
| `onUpload` | `pendingFiles` | 上传开始回调 |
| `onUploadBefore` | `pendingFiles` | 上传前回调,返回 false/Promise/Function 可阻止上传 |
| `onUploadSuccess` | `file` | 单个文件上传成功回调 |
| `onUploadError` | `file`, `error` | 单个文件上传失败回调 |
| `onUploadComplete` | `successCount`, `failCount` | 全部上传完成回调 |
| `onDblClick` | `file` | 文件双击回调,优先于默认预览行为 |
| `customActionMenu` | `file` | 自定义操作菜单,返回菜单项数组 |
### 上传配置
```javascript
uploadConfig: {
aliyun: {
getAliyunKey: function() {
// 返回 Promise,包含阿里云 OSS 凭证
return Promise.resolve({
accessid: 'your-access-key',
callback: '',
dir: 'upload/',
expire: 1704067200,
host: 'https://your-bucket.oss-cn-hangzhou.aliyuncs.com',
policy: 'your-policy',
signature: 'your-signature'
});
}
},
customUpload: null // 自定义上传函数
}
```
### 权限配置
```javascript
globalPermission: {
upload: true, // 是否允许上传
download: true, // 是否允许下载
delete: true, // 是否允许删除
view: true // 是否允许查看
}
```
## 文件数据结构
```javascript
{
_id: 'unique-id', // 文件唯一标识符(自动生成)
name: 'example.pdf', // 文件名
size: 1024000, // 文件大小(字节)
uploadDate: '2024-01-15T10:30:00', // 上传日期(ISO格式)
url: 'http://example.com/example.pdf', // 文件访问URL
file: null, // 本地File对象(仅待上传文件有)
status: 'uploaded' // 文件状态:pending/uploading/uploaded/failed
}
```
## API 方法
### setFiles(files)
设置文件列表,替换现有文件
```javascript
file.setFiles([
{ name: 'file1.pdf', size: 1024, uploadDate: '2024-01-01', url: '' },
{ name: 'file2.jpg', size: 2048, uploadDate: '2024-01-02', url: 'http://example.com/file2.jpg' }
]);
```
### getFileById(fileId)
根据文件ID获取文件对象
```javascript
var file = file.getFileById('file_123');
```
### getSelectedFiles()
获取当前选中的文件列表
```javascript
var selected = file.getSelectedFiles();
```
### updateState(state)
更新组件状态
```javascript
// 清空选择
file.updateState({ selectedFiles: [] });
```
### destroy()
销毁组件,清理资源
```javascript
file.destroy();
```
## 使用示例
### 示例1:基础用法
```javascript
var file = $('#fileContainer').G3File({
data: [],
previewUrl: 'https://preview.example.com?url=',
onUploadSuccess: function(file) {
console.log('上传成功:', file.name);
},
onDelete: function(files) {
console.log('删除文件:', files.length);
}
});
```
### 示例2:双击事件
```javascript
var file = $('#fileContainer').G3File({
onDblClick: function(file) {
// 自定义双击处理,优先于默认预览行为
alert('双击了文件: ' + file.name);
}
});
```
### 示例3:上传前确认
```javascript
var file = $('#fileContainer').G3File({
onUploadBefore: function(pendingFiles) {
// 返回 Promise 进行异步确认
return new Promise((resolve) => {
if (confirm('确定上传 ' + pendingFiles.length + ' 个文件?')) {
resolve(true);
} else {
resolve(false);
}
});
}
});
```
### 示例4:自定义操作菜单
```javascript
var file = $('#fileContainer').G3File({
customActionMenu: function(file) {
return [
{
title: '审核',
onClick: function(file) {
alert('审核文件: ' + file.name);
}
},
{
title: '编辑',
onClick: function(file) {
alert('编辑文件: ' + file.name);
},
disabled: false // 可选,是否禁用
}
];
}
});
```
### 示例5:删除前确认
```javascript
var file = $('#fileContainer').G3File({
onDeleteBefore: function(files) {
// 返回 Promise 进行异步确认(与 onUploadBefore 用法一致)
return new Promise((resolve) => {
if (confirm('确定删除 ' + files.length + ' 个文件?')) {
resolve(true);
} else {
resolve(false);
}
});
}
});
```
## 事件处理
### 双击行为优先级
1. 如果配置了 `onDblClick` 回调,优先执行回调
2. 如果未配置且文件已上传、可预览、有URL,则在新窗口打开预览
### 支持的预览文件类型
组件会排除以下不可预览的文件类型:
- 压缩包:.rar, .zip, .7z, .tar, .gz, .bz2
- 可执行文件:.exe, .dll, .bin, .msi, .cab, .rpm, .deb, .apk, .ipa
- 数据库文件:.dat, .db, .sqlite
- 临时文件:.bak, .tmp, .log, .cache
- 光盘镜像:.iso
## 浏览器兼容性
支持 IE11+ 和现代浏览器(Chrome、Firefox、Safari、Edge)
## 注意事项
1. 使用阿里云 OSS 上传时,必须配置 `uploadConfig.aliyun.getAliyunKey` 函数
2. 文件大小限制通过 `maxFileSize` 配置,默认 10MB
3. 预览功能依赖 `previewUrl` 配置的外部预览服务
4. 销毁组件时请调用 `destroy()` 方法,避免内存泄漏