服务端部署在rocky linux,使用语言为C++,客户端使用PyQt,数据库使用mysql+sqlite实现的网盘。
实现的功能:
- 支持正常的文件、文件夹的上传和下载
- 支持文件的移动、复制、剪贴、重命名等操作
- 支持服务端已有文件情况下的秒传
- 支持客户端以下载文件情况下的秒下
- 支持多用户同时上传文件
- 支持断点续传
- 支持断点续下
- 支持对用户密码传输的自定义加密
- 支持文件的延时删除
同一个md5码的文件只会存放在服务器一次,用户的文件都会链接到这个文件上去,如下,同一个用户的不同路径,不同用户都可以进行链接
所以对于用户来说,他的剪切、复制粘贴、重命名、新建文件夹这些操作其实都是对数据库中的表项进行操作而不涉及真正的文件,只有当上传一个系统中原本不存在该md5码的文件的时候才去将这个文件写入到真实文件中去,并在真实文件表中增加一项,而用户要下载时,就根据md5码直接打开files文件夹进行下载,因为文件是以md5码命名的。对于删除,需要删除用户自身的表项,还需要将真实文件系统的链接数减一,这里还做了一个特殊设计,就是当一个文件没有用户关联的时候,链接数为0,但这时候不立即删除文件,而是等待一段时间系统再去定时删除。
用户表:记录了用户的id、姓名、密码(md5码记录)、email、性别、等级、是否允许登陆
真实文件表:这里只记录真实文件的md5码、长度、链接数,文件是以md5为名保存在files文件夹下的。
用户文件表:这里有表项的id,用户的id(关联到用户表)、真实文件的md5码(关联到真实文件表),该文件在用户文件系统中的路径,用户上传该文件的时间、该文件是否是文件夹(0代表不是)。
- 首先发送文件md5码,若服务器存在,则完成秒传,即直接在数据库中添加一项,否则继续
- 文件上传时,服务器会将文件分成好几块,然后发送信息告诉客户端需要从哪里开始上传,上传多少字节,已经存在了多少字节,并且服务器会有相应的记录
- 多用户同时上传就是服务器告诉每个用户上传不同的片段,服务器对其进行统一管理
- 文件暂停上传就是将连接断开,直到点击继续下载,再次建立连接
- 文件的上传列表在客户端的数据库中也有记录,每次加载界面时取出没上传完的进行展示
- 选择文件下载时,首先查看文件下载记录,看该md5码是否曾经下载过,若下载过,则去查看文件是否存在,若也存在,就进行秒下,即将文件复制过去
- 发送md5码,要从哪里下载,下载多长
- 写入文件中,每次接收都在客户端的数据库中更新已经接收到的长度
- 每次点击下载或者点击继续就新建一个socket进行下载
- 每次暂停就把socket断开
- 每次启动就在数据库中遍历找到没有下载完的,展示到下载栏中
- 文件夹下载就在文件下载列表中记录相对应的父子关系,进入一个下载的循环,每次只取相同文件夹下的一个文件进行下载,下载完了就去下一个,直到全部完成
都是规定了信息格式,发送相应的信息,然后服务器对其数据库进行更新即可
用户这边用sqlite建立了一个小型的数据库
用户文件系统表:
记录了表项id,文件的md5码(只有文件有),文件在用户网盘中的目录,文件名(既包括文件夹名字又包括文件名字),文件类型(文件夹都叫文件夹,其他的取后缀作为名字),用户上传文件的时间
上传历史记录表:
表项id,上传文件的md5码,已上传文件的长度,文件总长度,文件的本地路径,文件的网盘路径,是否需要上传
下载历史记录表
表项id,文件md5码,已下载文件的长度,文件长度,下载到本地的路径,文件的名字,是否需要下载,文件所属的文件夹(对于文件夹下载而言),是否是文件夹,在网盘中的路径