【easy云盘 | day06】分页查询文件 + 文件秒传和分片上传


在这里插入图片描述

前言

再次重申,本项目非原创,视频来源于:
Springboot项目实战 easypan 仿百度网盘 计算机毕业设计 简历项目 项目经验(后端)

再次重申:本人不分享项目源码,支持项目付费!!

完成任务

1. 创建文件信息的表结构

设计文件信息标的相关字段和索引结构:
在这里插入图片描述

文件的相关操作时本项目重点,文件信息表的相关字段也比较繁杂,在写代码时,需要搞清楚字段的含义和类型。

2. 根据条件分页查询

controller 层代码实现:
在这里插入图片描述

设计 FileCategoryEnums 枚举:
在这里插入图片描述
根据前端传来的 query 来查询有没有选择文件的分类,如果有,由于数据库中 file_category 是 tinyint 类型,需要通过枚举将前端传来的文件分类设置为 Integer 的文件类型。
然后依次设置查询的条件:用户id,排序,文件状态(正在使用)。

service 层实现:
在这里插入图片描述
根据controller 层中设置的查询条件查找数据库中的文件总数 count,并设置每页记录的文件数 pageSize, 创建一个 SimplePage 对象。将该对象设置到查询条件 param 的属性中,根据 param 查询当前页显示的文件。再将查询结果封装到分页结果对象 PaginationResultVO 中。

  • SimplePage 是一个提供分页工具的类,它通过维护当前页码、总记录数、每页记录数等信息,帮助实现对数据的分页显示:
    在这里插入图片描述
  • PaginationResultVO 是一个关于分页结果的类,它存储分页有关的信息和当前页的文件列表:
    在这里插入图片描述

3. 文件上传

介绍一下文件切片上传的过程:前端接收到一个大文件时。会对文件进行切分,并在每次上传分片时告知后端当前上传的是第几个分片以及总的分片数量。

注意:大文件的分片是在前端做的,不是后端!!!

从前端访问的请求参数中也可看出:
在这里插入图片描述

在这里插入图片描述
controller 层代码实现:
在这里插入图片描述
从前端传入的信息中获取上传文件的相关信息,包括对文件进行分片的分片总数以及此次上传的是第几个分片。

service 层的实现就比较复杂了,写代码时需要仔细。
根据上传文件的 md5 值查找数据库,如果找到一个与上传文件 md5 值相同的文件,则可以进行秒传,不用分片。

(1)秒传

在这里插入图片描述
代码实现:
在这里插入图片描述

在文件上传第一个分片时,就根据文件的 md5 值查询数据库中是否存在相同 md5 值的文件,并且文件是在正常使用中的,如果存在,则可以进行秒传。(相同 md5 值的文件只要找到一个就可以进行秒传)

在秒传前需要检查用户的存储空间大小是否足够,即判断当前秒传的文件大小 + 用户已使用的文件空间大小 是否大于 为用户分配的总空间大小。如果大于,则抛出空间不足的异常。

若空间足够,则对获取到的文件进行一系列设置,注意:调用 autoRename() 方法对文件进行重命名,避免与同名文件发生冲突。在数据库的文件信息表中增加该条文件信息,并设置返回结果 resultDto 的 status 值。最后,要记得更新用户使用空间。

  • 自动重命名文件 autoRename() 方法:
    在这里插入图片描述
    查询当前用户是否存在相同文件名的文件,如果存在,则需进行重命名(文件名+随机字符串),调用 StringTools.rename() 方法:
    在这里插入图片描述
    分别调用方法对文件名进行拆分获取文件名和文件名后缀,再通过 “文件名_随机字符串.后缀” 的方式,重命名文件。
  • 更新用户使用空间 updateUserSpace() 方法:
    在这里插入图片描述注意看 mapper 层的 sql 语句,更新时需要保证用户的使用空间不应该大于用户分配的总空间:
    在这里插入图片描述

(2)分片上传

在这里插入图片描述
如果数据库中不存在与上传文件的 md5 值相同的文件,则进行分片上传。

代码实现:
在这里插入图片描述

在分片上传的过程中,也需要判断空间是否足够,所以在文件还没有完全上传完时,需要将已上传分片文件的大小保存在 Redis 中,作为临时存储。当某一分片上传时,先判断(该分片的文件大小 + Redis 中临时存储的已分片文件大小 + 用户已使用的空间 ) > 用户分配的总空间 ?如果大于,则抛出空间不足的异常。

若当前上传的文件分片小于总分片数时,对每次上传的分片文件都需要更新并保存 Redis 中已上传成功的分片文件大小。

  • RedisComponent 中获取和保存临时存储的文件大小:
    在这里插入图片描述

4. 文件上传的其它注意点

(1)前端报错——修改 nginx 配置

在这里插入图片描述
修改 nginx 下的 nginx.conf 配置文件,设置请求的 body 大小:
在这里插入图片描述

(2)后端报错——添加 spring文件大小配置

在这里插入图片描述
在配置文件中加入(这里写15MB,是因为这里的分片大小设置的是 10M,所以要设置比分片大):

#文件上传配置
spring.servlet.multipart.max-file-size=15MB
spring.servlet.multipart.max-request-size=15MB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值