说在前面:此项目是跟着B站一位大佬学的,不分享源码,支持项目付费
文章目录
- 分享列表
- 文件分享
- 有效期、提取码
- 分享链接
- 分享相关信息、提取码校验
- 外部文件分享列表
- 保存文件到网盘
分享列表
这个逻辑没啥好说的之前做过类似的,大家自己看噢。
文件分享
有效期、提取码
这个逻辑就是创建有效期和提取码。
分享链接
接着就是分享链接的生成
可以看到,这里用的方法还是之前下载文件那部分 文件下载 使用的code生成方法。这里不再叙述。
分享相关信息、提取码校验
然后我们根据这个链接,进到前端页面如下所示:
第一个,展示分享信息,这包括,分享人信息(头像昵称),分享时间,分享文件名称
第二个,提取码校验:
这些逻辑都蛮简单,就是接收用户输入的code,将其与我们之前存储在fileshare表中的对应shareid的code进行比较就可以了,大家自己看注释噢。
外部文件分享列表
难点来了!!!!
并不是说,你校验码相同就可以直接看到分享文件列表了,还要进行分享的处理,比如分享是否有效,是否存在。
还有要考虑分享内容的范围,避免用户恶意获得分享以外的文件。
会有疑问了,当时创建分享的时候,不就已经根据fileId生成了对应的shareId等相关数据,现在根据shareId来看分享内容怎么还会越界访问?
假如说,我们现在没有进行一系列的处理,简单的拿到链接就去获取分享内容。
现在我的根目录下有两个文件夹,其中文件夹python里面有一个文件。
我现在分享的是文件夹java学习,注意看下面的path。
现在的path(9341245645),也就是文件夹java的fileId,进入后可以看到里面的内容。
我直接修改路径上的参数,改为path(9578051961),文件夹python的fileId。
发现了什么?
发现文件夹python里面的内容暴露出来了。明明我没有分享这个,但是用户可以不走界面而是篡改路径参数获得其他文件,这就是问题所在。
接下来,就是处理这个问题。以下面的目录结构为例
文件夹2(想恶意获取,fileId=y,filePid=0)
文件1
文件夹1(想分享的,fileId=x,filePid=0)文件1.1
文件夹1.1
先进行分享的检查,是否为空,分享是否已过期。
然后前端传过来的参数有个filePid,用来拼接在分享链接后面。
如果filePid(x)不为空而且不为0,说明用户现在看的不是根目录那一层,而是进入了某个文件夹里(文件夹1)。如果用户点击进入文件夹,filePid就会变成这个文件夹的fileId,,这个filePid就是篡改的开始,用户可以将这个filePid改为另外的文件夹(文件夹2)的fileId(y)从而获得文件。
所以将这个filePid传给checkRootFilePid用来校验目标目录是否属于分享根目录的子树,例如,用户分享的是文件夹1(fileId=X),当用户尝试访问文件夹2(fileId=Y)时,系统需要验证Y是否是X的子目录,或者是否与X有层级关系。
其中如果你这个分享根目录rootFilePid(x)就等于fileId(x)的话,说明当前目录就是分享根目录,直接通过。
不然进入递归checkFilePid校验目录层级关系。(假设这里篡改为文件夹2
首先根据传过来的fileId(y)和userId,找到了对应的文件夹2。
然后如果发现文件夹2的filePid=0,说明查到了系统根目录仍未匹配rootFilePid,抛出异常。
如果filePid还没查到根目录0或者rootFilePid,就递归继续查它的上一级是否匹配rootFilePid。
慢慢理解吧大家------------->_<
保存文件到网盘
这里有两种情况
1.自己分享的文件只能下载,不能“保存到我的网盘”
2.分享给他人,可以直接下载,也可以保存到他自己的网盘
下载的逻辑就不再叙述,这里着重说明保存网盘。
这里先进行身份查看,对比分享人和web用户身份,自己分享的文件只能下载,不能“保存到我的网盘”。
保存到网盘的核心就是将分享文件保存到用户提供的目录myFolderId下。
然后就是将用户的文件列表放进currentFileMap,将分享的文件放进shareFileList,进行重命名的处理。
然后走findAllSubFile(List copyFileList, FileInfo fileInfo) ,将文件及其子文件添加到copyFileList中,最后批量插入到数据库中。
完成!!!(其实还有一些,但是逻辑都比较相似重复,没有再说的必要啦)
感谢大家的观看!!!!!若有任何问题,欢迎大家在评论区指出,共同学习