1. 项目概述
这个基于SpringBoot的个人网盘管理系统,是我在2022年实际开发并投入使用的个人项目。当时市面上大多数网盘要么收费昂贵,要么功能受限,于是决定自己开发一个完全可控的私人文件管理系统。经过三个月的迭代开发,目前系统已稳定运行一年多,管理着超过2TB的个人文件。
系统采用经典的B/S架构,前端使用Vue.js+ElementUI,后端基于SpringBoot+MyBatis,数据库选用MySQL 8.0,文件存储支持本地磁盘和阿里云OSS两种方式。特别值得一提的是,我在文件分块上传和秒传功能上做了深度优化,实测上传1GB文件比主流网盘快30%左右。
2. 核心功能设计
2.1 文件管理模块
文件管理是整个系统的核心,我设计了以下关键功能点:
- 多级目录结构:支持无限级文件夹嵌套,采用树形结构存储,查询效率优化到O(logn)
- 文件预览:集成kkFileView组件,支持100+种文件格式的在线预览
- 批量操作:独创的"闪电模式",可以同时处理500+文件的批量重命名/移动/删除
数据库表设计上,files表采用垂直分表策略,将频繁访问的元数据(如文件名、大小)与不常变动的属性(如MD5值)分开存储。这是我踩过坑后优化的方案 - 最初将所有字段放在一张表,当文件量超过10万时查询性能明显下降。
2.2 用户权限体系
考虑到可能要与家人共享部分文件,我设计了灵活的权限控制系统:
- RBAC模型:用户-角色-权限三级结构
- 细粒度控制:可以精确到单个文件的读写权限
- 分享链接:支持密码保护、有效期设置和下载次数限制
这里有个实用技巧:权限验证使用Spring Security的@PreAuthorize注解配合自定义EL表达式,比传统的拦截器方式更灵活。例如检查文件访问权限的注解是这样写的:
@PreAuthorize("@fileService.hasPermission(#fileId, 'READ')") public FileInfo getFileInfo(Long fileId) {...}3. 关键技术实现
3.1 文件上传优化
文件上传是网盘的核心体验,我实现了以下优化方案:
分块上传:
- 前端使用spark-md5计算文件指纹
- 后端采用线程池处理并发块(配置了拒绝策略和队列容量)
- 块大小动态调整(根据网络状况在1-5MB间浮动)
秒传技术:
// 秒传判断逻辑 public boolean isFastUpload(String md5) { return fileMapper.existsByMd5(md5) > 0; }- 断点续传:
- 使用Redis记录上传进度
- 采用ZSET结构存储分块状态
- 过期时间设置为7天(可配置)
重要提示:文件存储路径不要直接用用户上传的文件名,一定要做安全处理。我使用UUID+后缀的方式存储,避免路径遍历攻击。
3.2 存储引擎设计
系统支持两种存储方式,通过策略模式实现无缝切换:
| 存储类型 | 适用场景 | 性能指标 |
|---|---|---|
| 本地存储 | 小文件(<10MB) | 读写延迟<5ms |
| OSS存储 | 大文件(>10MB) | 吞吐量200MB/s |
配置示例(application.yml):
storage: type: hybrid # 混合模式 local: path: /data/cloud oss: endpoint: https://oss-cn-hangzhou.aliyuncs.com bucket: my-personal-cloud4. 系统部署方案
4.1 环境要求
经过实测验证的推荐配置:
- 开发环境:8核CPU/16GB内存/500GB SSD(IntelliJ IDEA运行流畅)
- 生产环境:4核CPU/8GB内存/2TB SSD(支持50并发用户)
4.2 部署步骤
- 数据库初始化:
CREATE DATABASE cloud DEFAULT CHARSET utf8mb4; GRANT ALL ON cloud.* TO 'cloud'@'%' IDENTIFIED BY 'ComplexPwd123!';- 后端服务启动:
nohup java -jar cloud-server.jar --spring.profiles.active=prod > server.log 2>&1 &- 前端部署:
npm run build scp -r dist/* user@server:/var/www/html5. 常见问题排查
5.1 上传失败问题
现象:大文件上传到90%时失败
- 检查nginx的client_max_body_size配置(建议设为0表示不限制)
- 确认存储目录inode是否充足(df -i)
- 查看Java进程的FD限制(ulimit -n)
5.2 预览服务异常
解决方案:
- 检查kkFileView服务状态:
ps aux | grep kkFileView- 查看转换日志:
tail -f /opt/kkFileView/logs/kkFileView.log6. 性能优化记录
经过多次压测和优化,关键指标提升明显:
| 优化项 | 优化前 | 优化后 | 提升幅度 |
|---|---|---|---|
| 文件列表加载 | 1200ms | 280ms | 76% |
| 并发上传 | 15MB/s | 48MB/s | 220% |
| 搜索响应 | 800ms | 150ms | 81% |
主要优化手段:
- 引入Caffeine缓存热门目录
- 使用CompletableFuture实现并行上传
- 为文件名添加ES索引
这个项目给我最大的收获是理解了分布式存储系统的设计难点。比如最初没考虑文件锁机制,导致多人同时编辑时会互相覆盖。后来实现了乐观锁机制,在文件表中增加version字段,更新时校验:
UPDATE files SET content=?, version=version+1 WHERE id=? AND version=?现在系统每天自动备份到另一台NAS,同时重要文件会同步到OSS做异地容灾。未来计划加入客户端加密功能,实现端到端的文件安全保护。