EasyPan后端笔记

项目名称:Easy云盘

写在前面:

本小白是某专科大二生,很多知识方面都没有学好,这是本人第一个入门项目,是跟着b站大学慢慢写出来的,加上杂七杂八的大概用时一个月左右!! 写这篇博客的目的也是为了记录一下逻辑,养成写小笔记的习惯,以后慢慢看!! 如果能帮助在写这个项目的同学也是很开心的!! 文中如果有理解不对的地方也请大家指定!感谢大家!!

项目描述: 一个仿百度云盘面向C端用户的网盘项目,包括用户注册,文件上传,分片上传,断点续传,秒传,文件在线预览,包括文本,图片,视频,音频,excel,word ,pdf 等文件在线预览,文件分享等功能。

技术选型:Springboot + mybatis + mysql+redis+ffmpeg

难点:

文件断点续传,切片上传,合并切片,秒传,在线播放视频,ffmpeg的使用等

接口文档:

Apipost-基于协作, 不止于API文档、调试、Mock、自动化测试

FFmpeg常用命令汇总_ffmpeg 命令-CSDN博客

整体架构图:

部分效果图:

关于接口逻辑:
ABaseController:

该控制层是父类,被其他控制层继承 方法有:

UserInfoController:

发送邮箱 sendEmailCode:

首先检查验证码的值是否相等与redis里面的,最终都要删除掉redis里面的临时验证码

!!获取用户头像:/getAvatar/{userId}

此部分用了腾讯的COS存储(免费三个月),大概就是设置一个桶,设置一个默认头像,用户需要更换头像只需要把新头像传到桶里面保存。

腾讯云存储上传头像、文件功能(超详细保姆级)_腾讯oss头像上传-CSDN博客

获取用户空间 getUseSpace

第一次调用改接口时,会设置用户空间 并调用saveUSerSpaceUse保存到redis里面

FileInfoController:

获取文件信息 就是登录进去后自动调用的 loadDataList:

前端传过来的类型都是all , 设置最近更新时间为排序并设置文件状态为使用中,调用服务层, 基本都是封装好的信息

uploadFile 上传文件(重点中的重点):

需要考虑的点:

如何实现切片上传?

如何异步合并分片?

如何实现秒传?

如何去判断上传的文件是否存在重命名?

如何判断磁盘空间是否足够

如何断点续传?等等

技术特点:

切片, 把文件切片上传速度会更快,并且可以做到视频边上传边播放

断点续传 , 秒传 , 默认切成十片,ffmpeg

大体逻辑:

生成文件id , 判断是否秒传(通过md5) , 不是秒传走正常逻辑 , 把切片保存到定义的临时文件夹,再去判断空间 , 最后合并

逻辑:

定义一个ResultDto里面有两个属性,一个是 fileId , 一个是status, 设置查询条件,查第一个切片的md5值是否在数据库中,如果存在,则判断磁盘空间是否足够复制多一份,并且调用重命名方法,更新redis和数据库里面的空间。

如果不是秒传则走正常上传,创建临时目录,定义临时临时目录名称(用户id+文件id),判断要上传文件是否大于总空间,保存切片到临时目录,判断是否是最后一个切片,redis保存临时文件大小, 设置文件名等基础值,最后插入,更新用户空间,在事务提交后自动调用转码方法,该方法里面调用分片合并代码

转码方法:

包含合并切片,切割视频边下边播,生成封面缩略图

合并切片方法:

在线预览接口getFile:

新建文件夹 newFloder:

首先检查文件夹名字是否重命名,之后就是插入

获取文件夹内部信息:

移动文件changeFileFolder:

首先需要检查移动的合法性,不能移动到自己文件所在的目录,虽然前端没显示,但是可以不走页面,所以这里要先检查合法性。

之后再判断是否需要移动到的父目录是否不等于0,把选中需要移动的id分隔放到一个集合,查询目标文件夹下的文件,检查是否有需要重命名的文件,遍历数组,最后更新

文件下载接口:

写在公共控制层里面

文件下载接口分为两个,一个是创建下载链接 一个是下载

点击下载跳到创建下载链接的原因是 部分电脑有下载器,点击下载会调用起来,但是下载不校验会出现安全问题,所以要先创建下载链接并且校验登录

问题:

下载需要做登录校验吗?

不需要:

部分浏览器可能会在下载模块集成第三方下载插件,比如迅雷。如果是通过迅雷进行下载,迅雷是拿不到我们的session的,也就是说第三方插件下载没有办法做接口鉴权。如果我们给下载文件接口做下载鉴权,可能会导致部分用户一直被拦截(迅雷无法传递session)。

我们这个项目支持用户分享下载链接,也就是是说其他用户可以通过用户分享链接下载指定文件。如果我们要做登录鉴权,那么就必须想办法内下载连接中内置session id,存在安全性问题。

逻辑:首先点击下载创建一个下载链接,并且生成一个下载的code 以及把所选的文件路径,名字放进redis,设置过期五分钟,接着回调下载接口,下载接口首先获取redis里面的信息 设置下载头,然后文件流下载

删除逻辑:

逻辑删除(移动到回收站):

用户选择的可能是一个文件夹 ,里面可能包含子文件夹或者其他文件,所以需要使用递归去获取选中的文件夹下的所有文件,最后把目录状态设置为回收站,目录下面的文件状态设置成删除。

RecycleController 回收站:
loadRecycleList 获取回收站列表:

recoverFile 回收站还原:

首先通过查询条件 用户id,选择的文件ids 以及状态 查询到一个fileInfoList集合,再去遍历这个集合 使用递归的方法把目录下的子目录....的文件放到一个集合delFileSubFolderFileIdList里面 ,再去获取根目录下的所有文件防止出现重命名,接着创建一个文件流之类的东西,如果出现文件名重复,则保留在根目录下的文件名。 再把集合delFileSubFolderFileIdList的文件标记成正常,接着把直接删除的文件也标记成正常,最后去做重命名

真实删除 delFile:

真实删除是在数据库把它删除掉,但是真正的文件还在服务器上保存,不用去删除,因为一个文件会被多个用户共享,意思是A传了一个文件,B也是,结果两个文件的md5值是一样的,所以如果删除在服务器的话 A删除文件B就不能用了。

解决方法:

其实就是在删除的时候在数据库层面搜索一下当前文件是否有被多个人共享,如果没有被多个人共享,就可以放心从服务器层面删除。

整体思路有三部分:

  • 找到待删除的目录的所有子文件和文件
  • 删除所选中的文件
  • 更新用户空间

shareFile 分享逻辑:
loadShareList 获取分享文件列表:

创建分享链接shareFile:

接收需要分享的文件id 过期时间validType(分别是1、3、7、永久) ,提取码(可自行设置或者系统生成),设置实体类,调用saveShare,判断过期时间存储到redis,判断提取码是否为空,设置分享id,插入到数据库。

取消分享链接cancelShare:

webShareController 网页分享控制层:

公用方法:检查分享是否过期,分享的文件是否已被删除,调用user层获取分享人信息

getShareLoginInfo 获取登录信息:

主要是通过session获取一些信息,判断当前分享链接的用户是否是当前登录的用户,假如是前端会把保存到我的云盘这个按钮隐藏调

checkShareCode 检查提取码

通过id获取到分享的信息,检查过期时间,检查提取码是否正确,并设置key到redis里面

loadFileList 获取分享的文件列表:

该接口最重要的是在检查是否存在越权,分享a目录,别人不能看到b目录的文件 ,首先检查分享是否失效,假如filePid不等于空并且不等于0,进入checkRootFilePid 检查,checkFilePid也是检索filePid目录下的所有文件,难点在于递归的理解。

saveShare 保存到我的云盘:

项目总结:

该项目是本小白第一个入门项目,做的过程中也感受到吃力,知识点的匮乏,逻辑上的不理解,到现在项目中还是有很多不太懂的东西,但是也是收获了不少知识点,SpringBoot的基本使用,sping的aop切面,redis的缓存使用情况,避免重复查询数据库,也大概了解到一些ffmpeg技术,用来对文件进行分片、合并等等。只是这个项目可能提前封装的东西会比较多,没有源码还是比较难受的,本人的第一篇博客就到此完结把!! 还有很多不足需要改进,欢迎大家指点!! (源码有需要可以联系本人)

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值