精品分享:基于SpringBoot+Vue开发的云盘系统(含⼤⽂件断点续传剖析)引⾔
作为开发⼈员,我们经常需要存储和下载⽂件,为了使⽤⽅便,通常都会将⽂件存储在云端,市⾯上使⽤率最⾼的云端存储莫过于百度⽹盘了,但使⽤别⼈的东西难免会受到各种各样的限制,必须花钱才会享受到更好的服务体验,所以很多公司和个⼈都会搭建⾃⼰的云盘系统来使⽤,⼀来⽂件捏在⾃⼰⼿⾥,更放⼼,更安全,⼆来可以根据⾃⼰的需求定制⼀些个性化服务。
最近公司也要做⼀个⾃⼰的存储服务,要求⽀持⼤⽂件断点续传,在线解压缩等功能,由于是内部项⽬,⾃由度相对较⾼,所以我在⽹上了⼀个开源项⽬ - 奇⽂⽹盘,在它的基础上,修复了上传时候进度提⽰显⽰有误的 bug,同时添加了对 rar5 ⽂件的在线解压⽀持,剔除了⼀些繁琐的功能,同时利⽤ JxBrowser 套壳实现了⼀个客户端版本。在此分享给⼤家,希望能够对你有所帮助,具体的源码资料可在⽂末获取哦。
系统展⽰
⾸页
系统⾸页主要对系统功能进⾏了描述和展⽰。
注册
注册页⾯提供滑动解锁插件,在输⼊⽤户名、⼿机号、密码之后,点击注册就可以注册成功。
登录
输⼊⼿机号和密码,滑动解锁,点击登录按钮即可登录。
⽹盘主页采⽤左右布局,并且做了屏幕⾃适应,包含了⽹盘的主要功能模块。
⼤⽂件断点续传剖析
系统前端的核⼼代码主要位于 src\components\file\box\uploadFile\Box.vue ⽂件中,⾥⾯包含了⼤⽂件的断点续传等操作,我们借助了 vue-simple-upload 组件辅助实现⼤⽂件的断点续传。
系统后端的核⼼代码主要位于 controller 包下的 FileController 和 FiletransferController 两个类,⾥⾯包含了对⽂件的上传,下载以及各种操作的 api 实现。
难点主要在于超⼤⽂件的断点续传,⽐如刷新页⾯,停电等导致上传中断,再次上传该⽂件时可以从之前中断的位置继续上传,⽽不必从头开始,断点续传主要分为以下⼏个步骤:
1. 前端上传⽂件时,获取⽂件 md5 值,作为⽂件的唯⼀标识,获取⽂件⼤⼩,根据每个切⽚的⼤⼩(⾃定义,前后台保持⼀致)计算
总切⽚数⽬,发送 md5 和切⽚信息请求后台;
2. 后端拿到 md5 值以后,查询到该⽂件,根据切⽚信息判断⽂件是否已经上传完毕,如果已经上传完毕,则不⽤重新再上传,达到极
速秒传的效果,若没有上传完毕,把已经上传的切⽚数组返回给前台,如 [1,2,3],没有则返回空;
3. 前端对⼤⽂件进⾏切⽚。⽐如⼀个 100M 的⽂件,⼀个分⽚是 5M 的话,那么这个⽂件可以分20次上传。
4. 前端请求后台发送切⽚,跳过已经上传的切⽚,每个切⽚上传的时候需要发送切⽚的具体信息:如切⽚⼤⼩,所有切⽚数,总⼤⼩,
当前切⽚⼤⼩,当前切⽚数以及 md5 码等
5. 后台接收切⽚上传请求,保存切⽚的相关信息,对上传的切⽚进⾏判断,当最后⼀个切⽚上传完毕后,合并所有切⽚,上传完毕。
具体流程图如下:
以上便是对⼤⽂件断点续传的简单剖析,理解原理之后,代码实现就不再是难事,感兴趣的朋友可以在⽂末获取相关源码资料⾃⾏研究,这⾥我们不过多赘述。
后端部署
系统数据库表结构⽆需⼿动初始化,启动的时候 jpa 会⾃动检查,⽣成表结构。
vuejs流程图插件数据需要⼿动初始化⼀下,复制以下内容执⾏即可:
delete from user where userId =1;
insert into user(userId, username, telephone, salt, password, available)values(1,'admin','admin','admin','df655ad8d3229f3269fad2a8bab59b6c',1);
delete from role where roleId in(1,2);
INSERT INTO`role`(`roleId`,`available`,`description`,`roleName`,`createTime`,`createUserId`,`modifyTime`,`modifyUserId`)VALUES(1,1,'超级管理员','超级管理员',NULL,NULL,'2021-11-10 20:46:06',NULL);
INSERT INTO`role`(`roleId`,`available`,`description`,`roleName`,`createTime`,`createUserId`,`modifyTime`,`modifyUserId`)VALUES(2,1,'普通⽤户', '普通⽤户',NULL,NULL,NULL,NULL);
delete from sysparam where sysParamId in(1,2,3);
insert into sysparam (sysParamId, sysParamKey, sysParamValue, sysParamDesc)values(1,'totalStorageSize','10240','总存储⼤⼩(单位M)');
insert into sysparam (sysParamId, sysParamKey, sysParamValue, sysParamDesc)values(2,'initDataFlag','1','系统初始化数据标识');
insert into sysparam (sysParamId, sysParamKey, sysParamValue, sysParamDesc)values(3,'version','1.1.2','当前脚本的版本号');
delete from filetype where fileTypeId in(0,1,2,3,4,5);
INSERT INTO`filetype`(`fileTypeId`,`fileTypeName`)VALUES(0,'全部');
INSERT INTO`filetype`(`fileTypeId`,`fileTypeName`)VALUES(1,'图⽚');
INSERT INTO`filetype`(`fileTypeId`,`fileTypeName`)VALUES(2,'⽂档');
INSERT INTO`filetype`(`fileTypeId`,`fileTypeName`)VALUES(3,'视频');
INSERT INTO`filetype`(`fileTypeId`,`fileTypeName`)VALUES(4,'⾳乐');
INSERT INTO`filetype`(`fileTypeId`,`fileTypeName`)VALUES(5,'其他');
delete from fileextend where1=1;
INSERT INTO`fileextend`(`fileExtendName`)VALUES('png'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('tif'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('gif'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('jpeg');
INSERT INTO`fileextend`(`fileExtendName`)VALUES('doc'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('docx'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('docm'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('dot'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('dotx'); INSERT INTO`fileextend`(`fileExtendName`)VAL
UES('dotm'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('odt'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('fodt'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('ott'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('rtf'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('txt'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('html'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('htm'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('mht'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('xml'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('pdf'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('djvu'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('fb2'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('epub'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('xps');
INSERT INTO`fileextend`(`fileExtendName`)VALUES('xls'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('xlsx'); INSERT INTO`fileextend`(`fileExtendName`)VAL
UES('xlsm'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('xlt'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('xltx'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('xltm'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('ods'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('fods'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('ots'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('csv');
INSERT INTO`fileextend`(`fileExtendName`)VALUES('pps'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('ppsx'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('ppsm'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('ppt'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('pptx'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('pptm'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('pot'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('potx'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('potm'); INSERT INTO`fileextend`(`fileExtendName`)VA
LUES('odp'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('fodp'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('otp');
INSERT INTO`fileextend`(`fileExtendName`)VALUES('hlp'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('wps');
INSERT INTO`fileextend`(`fileExtendName`)VALUES('avi'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('mp4'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('mpg'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('mov'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('swf'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('wav'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('aif'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('au'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('mp3'); INSERT INTO`fileextend`(`fileExtendName`)VALUES('ram');

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。