--- title: 网盘项目 date: 2024-10-07 categories: [工作, 项目] tags: [项目] --- - 描述· - 单人云盘、team云盘、局域网使用 - 存储 - 文件信息:MySQL - 文件存储:磁盘 - 模式 - 局域网使用 - 仅开放一个文件夹,提供用户使用,只允许上传和查看 - 互联网使用 - 允许多个用户一起使用 - 基础功能 - 登录 - root用户 - 普通用户 - 查询文件 - 简单查询 - 条件程序(SQL) - 上传文件 - 下载文件 - 删除文件 - 链接分享 - 用户管理(root用户) - 创建用户 - 修改用户文件权限 - 删除用户 命令表 |命令|描述|使用| |---|---|---| |ls|当前目录下的文件|ls| |pwd|当前位置|pwd| |show|查看文件结构|show| |stat 文件名|查看文件具体信息|stat xxx| |cd /x/|切换目录|2条| |mkdir xx|创建目录|2条| |rm xxx|删除文件、文件夹|2条| |mv xx xx|移动|三条| |rename xx xx|重命名|三条| |up xx xx|上传文件|三条| |down xx xx|下载文件|三条| ```SQL myproject/ ├── src/ │ └── com/ │ └── example/ │ ├── Main.java │ └── Helper.java └── bin/ ``` ![ff3c9978-5098-479a-921b-ba655bced945.png](网盘项目/ff3c9978-5098-479a-921b-ba655bced945.png) ```SQL 联网判断 cd /xx/xx cd ../xx cd ./xx 本地判断 cd .. cd . cd / ``` ![image 41.png](网盘项目/image41.png) ![image 1 23.png](网盘项目/image123.png) ![image 2 15.png](网盘项目/image215.png) ```SQL / ├── src/ │ └── com/ │ └── example/ │ ├── Main.java │ └── Helper.java └── bin/ / |--- 我的资源 | ``` 通信协议 ```SQL ls cd 目录 mv 目录 目录 up 文件 目录 down 文件 目录 ls 长度 id;目录; LTV 文件形式(1+8) 属性长度 byte (命令)属性 行为 byte 文件长度 long 内容 byte[length] 请求头读完了 请求头没读完 buffer满了 读事件结束了 客户端关闭(基本不可能,因为还需要写操作) 异常断开 情况: 12 121221323 128 12323231231232132132321121321321321321322121 短的分析 网络好 12 121221323 网络不好 12 121 2 21323 长的分析 网络好 128 123232312312321321323 21121321321321321322121 网络不好 128 12323 23 123123 2132 132321121321321321321322121 ``` 1. **返回值为正数**: - 表示成功读取了数据,返回值是实际读取的字节数。 - 例如,如果读取了 10 个字节,返回值为 10。 2. **返回值为 0**: - 表示没有数据可读,但连接仍然处于打开状态。 - 这种情况通常发生在对端还没有发送数据,或者数据已经全部读取完毕但对端还没有关闭连接。 3. **返回值为 -1**: - 表示对端已经关闭了连接,没有更多的数据可读。 - 这是判断对端已经断开连接的关键标志。 transferTo和transferFrom都是用于通道间直接传输数据,效率高(可能使用零拷贝): ```Java // transferTo: 从source通道传输到target通道 sourceChannel.transferTo(position, count, targetChannel); // transferFrom: 从source通道接收数据到target通道 targetChannel.transferFrom(sourceChannel, position, count); ``` 主要特点: 1. 适用于FileChannel、SocketChannel等 2. position指定开始位置 3. count指定最大传输字节 4. 返回实际传输字节数 5. SocketChannel传输可能不完整,需要循环传输 需要代码示例吗? **请求结构** ```JavaScript 下载请求 长度:76(1) 类型:10(1) 用户id:533909ec-2b8f-4b90-87ec-77c81cbc6fa3(36) 文件地址:/我的资源/DJI_20241028195835_0071_D.MP4(39) ``` ```JavaScript 下载响应 长度:44(1) 类型:0(1) 请求长度:20(4) 文件实际地址:E:/视频/DJI_20241028195835_0071_D.MP4(39) ``` ```JavaScript 下载请求 长度:44(1) 类型:11(1) 第几份:0(4) 文件地址:E:/视频/DJI_20241028195835_0071_D.MP4(39) ``` ```JavaScript 下载响应 长度:13(1) 类型:0(1) 起始位:0(8) 文件长度:1024*1024*100(4) --------------------------------- 文件内容:100101010 ``` ```JavaScript 上传请求 长度:76(1) 类型:20(1) 用户id:533909ec-2b8f-4b90-87ec-77c81cbc6fa3(36) 文件地址:/我的资源/DJI_20241028195835_0071_D.MP4(39) ``` ```JavaScript 上传响应 长度:25(1) 类型:0(1) 文件保存地址:/java/data/DJI_20241028195835_0071_D.MP4(24) ``` ```JavaScript 上传请求 长度:37(1) 类型:10(1) 起始位:0(8) 长度:1024*1024*10(4) 文件保存地址:/java/data/DJI_20241028195835_0071_D.MP4(24) -------------------------------- 文件内容:100101010 ``` ```JavaScript 上传响应 长度:1(1) 类型:0(1) ``` --- 其他请求 ```JavaScript 查看请求:show 文件 长度:37(1) 类型:7(1) 用户id:533909ec-2b8f-4b90-87ec-77c81cbc6fa3(36) 文件保存地址:E:/视频/result/DJI.MP4(24) ``` ```JavaScript 下载请求 长度:76(1) 类型:10(1) 用户id:533909ec-2b8f-4b90-87ec-77c81cbc6fa3(36) 文件地址:/我的资源/DJI_20241028195835_0071_D.MP4(39) ``` ```JavaScript 下载响应 长度:48(1) 类型:0(1) 文件长度:2027481740(8) 文件保存地址:/java/data/DJI_20241028195835_0071_D.MP4(24) ``` ```JavaScript 下载请求 长度:52(1) 类型:11(1) 起始位:0(8) 文件长度:1024*1024*100(4) 文件地址:/java/data/DJI_20241028195835_0071_D.MP4(24) ``` ```JavaScript 下载响应 长度:1(1) 类型:0(1) --------------------------------- 文件内容:100101010 ``` ```JavaScript 上传请求 长度:76(1) 类型:20(1) 用户id:533909ec-2b8f-4b90-87ec-77c81cbc6fa3(36) 文件地址:/我的资源/DJI_20241028195835_0071_D.MP4(39) ``` ```JavaScript 上传响应 长度:25(1) 类型:0(1) 文件保存地址:/java/data/DJI_20241028195835_0071_D.MP4(24) ``` ```JavaScript 上传请求 长度:37(1) 类型:21(1) 起始位:0(8) 长度:1024*1024*10(4) 文件保存地址:/java/data/DJI_20241028195835_0071_D.MP4(24) -------------------------------- 文件内容:100101010 ``` ```JavaScript 上传响应 长度:1(1) 类型:0(1) ``` ### **如何将tinyint值NULL更改为默认的'0‘** - 默认处可以输入,如果无法修改,先设置为可以为null再操作 ![image 3 14.png](网盘项目/image314.png) 使用netty开发一个分片上传、下载系统,客户端发出下载请求,请求包含文件必要信息(文件名、起始位、文件长度等),服务端接收消息进行响应,响应内容保存文件必要信息、文件内容,客户端接收响应,根据响应保存文件;上传逻辑类似 ```Java public void channelRead(ChannelHandlerContext ctx, Object o) throws Exception { ByteBuf buf=(ByteBuf)o; if (!receivingFile) { // 处理元数据 metadata = FileMetadata.fromBytes(buf); System.out.println("客户端接受了消息: "+metadata); prepareFileReceiving(metadata); receivingFile = true; ctx.fireChannelRead(buf); return; } buf = buf.unwrap(); //分了两次 if(buf.readableBytes()==0) { //需要继续处理 ctx.fireChannelRead(buf); return; } System.out.println("==========================文件处理!"); int read = fileChannel.write(buf.nioBuffer()); System.out.println("====================="+read); } ``` 发送byte请求 - 传入bytebuf,对象自己转成byte 接收byte请求 - 传入byteBuf,返回对象 移除handle,系统会将剩余的handle都处理了! ```JavaScript 下载请求 是否有文件:false 起始位:0 长度:1024 服务器文件地址:/java/data/DJI.MP4 用户文件地址:E:/result/Df.MP4 ``` ```JavaScript 下载响应 是否有文件:true 起始位:0 长度:1024 服务器文件地址:/java/data/DJI.MP4 用户文件地址:E:/result/Df.MP4 --------------------------------- 文件内容:100101010 ``` ```JavaScript 上传请求 是否有文件:true 起始位:0 长度:1024 服务器文件地址:/java/data/DJI.MP4 用户文件地址:E:/result/Df.MP4 --------------------------------- 文件内容:100101010 ``` ```JavaScript 上传响应 状态:true 消息:保存成功 ``` 分片请求 检查是否有分片 ```JavaScript 下载请求 是否有文件:false 起始位:0 长度:1024 服务器文件地址:/java/data/DJI.MP4 用户文件地址:E:/result/Df.MP4 ``` ```JavaScript 下载响应 是否有文件:true 起始位:0 长度:1024 服务器文件地址:/java/data/DJI.MP4 用户文件地址:E:/result/Df.MP4 --------------------------------- 文件内容:100101010 ``` ```JavaScript 上传请求 是否有文件:true 起始位(第几片):1 长度:1024 服务器文件地址:/tmp/md5/1 用户文件地址:E:/result/Df.MP4 --------------------------------- 文件内容:100101010 ``` ```JavaScript 上传响应 状态:true 消息:保存成功 ``` ```JavaScript 合并请求 是否有文件:false 起始位(总片数):18 长度:1024 服务器文件地址:/tmp/md5/1 用户文件地址:E:/result/Df.MP4 ``` ```JavaScript 上传响应 状态:true 消息:保存成功 ``` - 明天功能 - ~~下载指定id~~ - ~~优化结构~~ - ~~生成idTree~~ - 分享功能(下周做) - 指定id,生成链接 数据库设计 发送文件 ```JavaScript 命令:send file ip:192.168.1.100 测试成功! 输入本地文件地址: ``` 接收文件 ```JavaScript 命令:receive file ip:192.168.1.100 (回车关闭) ``` 以下是一个典型网盘程序的8个功能模块,它们涵盖了大多数网盘应用的核心功能: **1. 用户管理模块** - **功能描述**:提供用户账户注册、登录功能 - **具体功能**: - 用户注册和登录 - 用户信息修改 - 查看空间 - 修改保存地址配置 - 密码找回(❓) **2. 文件/夹管理模块** - **功能描述**:创建、修改、删除文件夹 - **具体功能**: - 创建文件夹 - 移动、删除、重命名文件/夹 3. **文件查看与信息模块** - **功能描述**:通过命令行显示文件的基本信息、文件结构属性 - **具体功能**: - 列出文件夹树、列表结构 - 查看文件的详细信息(如大小、修改时间、类型等) **4. 搜索模块** - **功能描述**:支持用户在网盘中搜索文件 - **具体功能**: - 文件名搜索(模糊查询) - 按类型(图片、视频、文档等)搜索 **5. 文件上传、下载模块** - **功能描述**:关于文件上传、下载 - **具体功能**: - 自定义通信协议 - 支持文件、文件夹上传下载 - 提供下载速度、进度显示 - md5校验避免重复文件 - 大文件分片传输 - ~~文件加密~~ **6. 文件分享模块** - **功能描述**:允许用户将文件或文件夹分享给其他用户或生成共享链接。 - **具体功能**: - 生成共享链接(可设置有效期) - 分享文件的管理(取消分享) - 通过链接进行保存、下载 **7.管理员管理模块** - **功能描述**:提供管理员对整个网盘系统的全面控制,包括用户管理、删除文件的恢复、存储空间分配和其他高级管理任务。 - **具体功能**: - 管理所有用户账号:创建、删除和修改用户账号 - 管理删除文件:查看和恢复用户删除的文件 - 分配和调整用户的存储空间配额 - 对异常操作进行干预(如锁定账号或限制操作) - ~~查看和统计所有用户的存储使用情况~~ - ~~审查用户的操作日志(如文件的上传、删除、分享等操作)~~ **8.局域网文件传输模块** - **功能描述**:提供用户在同一局域网内的直接文件传输功能,支持快速的面对面文件共享,避免互联网依赖。 - **具体功能**: - 支持pc客户端半双工通信(便于接收文件),基于自定义协议,文件上传效率搞 - 支持跨设备的局域网通信,基于http协议,上传效率底 **总结** 这8个功能模块涵盖了网盘应用的各个方面,从文件操作到安全保护,提供了一个完整的网盘系统功能集合。每个模块都可以根据具体需求进行扩展和定制,以满足不同用户群体的使用需求。 下载速度显示 ~~速度显示~~ 分享 - 查看分享表 - 取消分享 - 设置分享时间 - 设置密码 注册,以及空间显示 完成分享测试 管理员 前端界面优化(ai) - 选择上传 - 速度显示 pc、手机传输 - 手机端 - 上传:扫码选择上传 - 下载: - pc端 - 上传 - 下载 ```Java _ _ ____ _ _ _ _ .-~~~-. | | | | _ \| \ | | | | | .-~~' __ `~~-. | |__| | |_) | \| | | | | / .-~ ~-. \ | __ | _ <| . ` | | | | | .-' `-. | | | | | |_) | |\ | |__| | \ / \ / |_| |_|____/|_| \_|\____/ `-.~ ._ .,., ,..~-' .--.-. ( ( )__ (_, \ ) ,_) '-'--`--' .-~~~-. .-~~' __ `~~-. / .-~ ~-. \ | .-' `-. | \ / \ / `-.~ ._ .,., ,..~-' ``` 对服务端异常进行处理,将序列化错误、连接中断 处理服务器端异常 ![image 4 13.png](网盘项目/image413.png) 连接异常 ![image 5 12.png](网盘项目/image512.png) 登录报错 ![image 6 10.png](网盘项目/image610.png) ```Java # 登录mysql,在默认安装时如果没有让我们设置密码,则直接回车就能登录成功。 sudo mysql -uroot -p # 设置密码 mysql8.0 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'hbnu'; # 设置密码 mysql5.7 set password=password('新密码'); # 配置IP 5.7 grant all privileges on *.* to root@"%" identified by "密码"; # 刷新缓存 flush privileges; ``` 题目描述 假设系统中有A、B、C三类资源,且有五个并发进程,要求输入系统空闲资源数Avaiable,以及每个进程运行所需的资源总量Caim、已经分配得到的资源量Alocation,利用银行家算法计算资源总量Resource和需求矩阵Need。 输入格式 程序要求输入六行,以回车符号作为分隔,第一行是三个整数,整数之间以空格作为分隔,表示当的系统A、B、C三类空闲资源数Avallable,下面的五行分别表示每个进程运行所需的资源总量Caim和已经分配得到的资源量Alocatin;每行有7个数据,以空格作为分隔。首先输入一个字符串(长度小于等于10),为进程名;第2、3、4个数掘类型为整型,表示相应进程运行所需A、B、C三种资源总量Caim;第5、6、7个数据类型为整型,表示相应进程已经分配得到的A、B、C三种资源量Alocation。 输出格式 输出六行,以回车符号作为分隔,第一行是三个整数,整数之间以空格作为分隔,表示系统的A、B、C三类资源总量Resource,下面的五行分别表示每个进程运行还需要的资源量:每行有4个数据,以空格作为分隔。首先输出一个字符串(长度小于等于10),为进程名;第2、3、4个数据类型为整型,表示相应进程运行还需的A、B、C三种资源量。 输入样例 3 3 2 P0 7 5 3 0 1 0 P1 3 2 2 2 0 0 P2 9 0 2 3 0 2 P3 2 2 2 2 1 1 P4 4 3 3 0 0 2 输出样例 10 5 7 P0 7 4 3 P1 1 2 2 P2 6 0 0 P3 0 1 1 P4 4 3 1 ![QQ_1733367586038.png](网盘项目/QQ_1733367586038.png) 题目描述 假设系统中有A、B、C三类资源,且有四个并发进程,要求输入资源总量Resource,以及每个进程运行所需的资源总量Ciaim和已经分配得到的资源量Alocation,利用银行家算法判断当前状态是否为安全状态,若为安全状态则给出一个安全序列。 输入格式 程序要求输入五行,以回车符号作为分隔,第一行是三个整数,整数之间以空格作为分隔,表示A、B、C三类资源的总量,下面的四行分别表示每个进程运行所需的资源总量Claim和已经分配得到的资源量Alocation;每行有7个数据,以空格作为分限。首先输入一个字符串(长度小于等于10),为进程名;第2、3、4个数据类型为整型,表示相 应进程运行所需A、B、C三种资源总量Claim;第5、6、7个数据类型为整型,表示相应进程已经分配得到的A、B、C三种资源量Alocation。 输出格式 输出一个字符串。若当前为不安全状态则输出为"false”(不含双引号,所有字母皆为小写);若当前为安全状态则输出一个安全序列,进程名之间用空格作为分隔。 输入样例 9 5 7 P1 5 3 4 2 1 3 P2 9 5 2 2 1 1 P3 3 2 2 2 2 1 P4 6 4 1 1 1 1 输出样例 p3 p1 p4 p2 题目描述 当采用可变分区分配方案对512KB的内存进行管理时,要求输入多个进程已经占用分区信息,多个进程内存回收信息,输出显示空闲分区的个数。 输入格式 程序要求输入3行,以回车符号作为分隔,第一行是一个整数n(10>n>0),表示n个进程已经占用分区;第二行是2n个整数,以空格作为分隔,依次按地址递增对应第一行n 个进程(进程编号依次为p1、p2、p3….pn,p为小写字母)已经占用分区的起始地址和存储容量(单位为K8)。第三行是一个字符串,用进程编号表示所回收的进程,编号之间用空格作为分隔符。 输出格式 输出一个整数表示回收后空闲分区的个数,若有回收的进程不存在,则输出“false”(不含双引号,所有字母皆为小写) 输入样例 2 0 60 100 220 p1 输出样例 2 题目描述 分页式存储系统中利用位示图对8*8块的存储器进行管理(块下标从0到63)。若已有块号为1、3、5、7、9、11、13、15、17、19的十个内存块被占用。现有四个进程要申请内存空间(每个进程最多为54个页面,编号为0到53也即申请的内存空间最多为54块)以装入。若系统有足够的空间能满足进程所申请的空间则技照从上到下,从左到右的顺序扫描位示图选择空块将其装入,否则进程在外存等待。 输入格式 程序要求输入2行,以回车符号作为分隔,第一行是四个整型数,以空格作为分隔,分别表示四个进程(进程编号依次为1、2、3、4)所申请的内存块数。第二行是2个整 数,以空格作为分隔。第一个整数N(1<=N<=4)表示所输入的是进程编号为N,第二个是整数M(0<-M<=53),表示进程编号为N的M号页面。 输出格式 若进程N装入了内存且页号M合理,则输出为一个整数,表示该页面所装入的内存块号:若进程N装入了内存但页号M有错,则输出字符串"eror”(不含双引号,所有字母皆为小写);若进程N在外存等待,则输出字符串“wait"(不含双引号,所有字母皆为小写) 输入样例 16 16 16 16 4 1 输出样例 wait 题目描述 要求输入一个柱面访问请求序列以及当前磁头所在柱面号和移动方向,输出采用电梯调度算法时移动臂响应的柱面访问序列。 输入格式 程序要求输入3行,以回车符号作为分隔,第一行是2个整型数n,m,之间用空格隔开,n表示当前磁头所在的柱面号,m表示第二行输入m个数;第二行是m个整数,数之间以空格作为分隔,表示柱面访问请求序列;第三行是数字-1或1,当为-1时表示移动臂向柱面号减小方向移动,当为1时表示移动暋向桂而号增大方向移动。 输出格式 输出m个整数,数之间以空格作为分隔,采用电梯调度算法时移动臂响应的柱面访问序列。 输入样例 15 10 24 38 2 110 43 36 5 11 6 180 -1 输出样例 11 6 5 2 24 36 38 43 110 180 ======================================== 题目描述 要求输入4个进程的信息,若进程调度采用短作业优先SJF调度算法(若所需运行时间一样,则按照输入顺序执行),请输出各个进程的周转时间 输入格式 程序要求输入4行,以回车符号作为分隔,每行有3个数据,以空格作为分隔。首先输入一个字符串(长度小于等于10),为进程名,第2个数据类型为整型,表示进程到达的时刻,第3个数据类型为整型,表示进程所需运行的时间 输出格式 按照输入的顺序依次输出各个进程的周转时间,各个整数之间用一个空格作为分隔。 输入样例 P1 0 9 P2 0 4 P3 0 10 P4 0 8 输出样例 21 4 31 12 题目描述 要求输入4个进程的信息,若进程调度采用最短剩余时间优先SRTF调度算法(若所需运行时间一样,则技照输入顺序执行。),请按照执行过程的顺序输出各个进程的名称 输入格式 程序要求输入4行,以回车符号作为分隔,每行有3个数据,以空格作为分观,首先输入一个字符串(长度小于等于10),为进程名,第2个数据类型为整型,表示进程到达的时刻,第3个数据类型为整型,表示进程所需运行的时间, 输出格式 按照执行过程的顺序输出各个进程的名称即一个字符串,进程名称之间用一个空格作为分隔。 输入样例 P1 0 9 P2 0 4 P3 0 10 P4 0 8 输出样例 P2 P4 P1 P3 题目描述 分页式存储系统中利用位示图对8*8块的存储器进行管理(块下标从0到63)。若已有块号为1、3、5、7、9、11、13、15、17、19的十个内存块被占用。现有四个进程要申请内存空间(每个进程最多为54个页面,编号为0到53也即申请的内存空间最多为54块)以装入。若系统有足够的空间能满足进程所申请的空间则技照从上到下,从左到右的顺序扫描位示图选择空块将其装入,否则进程在外存等待。 输入格式 程序要求输入2行,以回车符号作为分隔,第一行是四个整型数,以空格作为分隔,分别表示四个进程(进程编号依次为1、2、3、4)所申请的内存块数。第二行是2个整数,以空格作为分隔。第一个整数N(1<=N<=4)表示所输入的是进程编号为N,第二个是整数M(0<=M<=53),表示进程编号为N的M号页面。 输出格式 若进程N装入了内存且页号M合理,则输出为一个整数,表示该页面所装入的内存块号:若进程N装入了内存但页号M有错,则输出字符串"eror”(不含双引号,所有字母皆为小写);若进程N在外存等待,则输出字符串“wait"(不含双引号,所有字母皆为小写) 输入样例 16 16 16 16 4 1 输出样例 wait 管理员功能 - 用户 - 查看用户 ls user - id 名称 注册时间 上次登录 使用空间 总空间 是否注销 - 封号 close id - 恢复 start id - 彻底删除用户 delete user id - 用户下的所有文件都删除 - 增加空间 space add id XG - 文件 - 查看所有用户删除的文件 ls file - fid 用户名称 文件名称 类型 - 查看服务器所有无用文件 ls sfile - fid 文件名称 类型 大小 - 删除所有用户删除文件 delete fileall - 删除所有无用文件 delete sfile - 获得所有文件的地址,数据库将记录去除,通知服务器将文件全部清除 - 恢复用户文件夹 rollback uid ```Java FROM openjdk:17 WORKDIR /app COPY FileServer.jar /app/FileServer.jar EXPOSE 8972 CMD ["java", "-jar", "FileServer.jar"] # 在Dockerfile所在目录执行 docker build -t FileServer:1.0 . curl https://www.baidu.com ``` 回滚数据判断文件夹名 写一个下载、上传工具 - 上传API - 下载API - 分片上传 - 断点续传 前端 :发送文件md5,检查分片进度请求(判断上传了几个),返回值为已经上传几个分片 :分片上传(上传未上传部分) :整合请求