【Easy云盘 | 第四天】创建表结构以及实现文件的分片上传

前言:

        本项目非原创,我也只是作为一名初学者跟着成熟的up主一起敲代码而已。视频来源于:

Springboot项目实战 easypan 仿百度网盘 计算机毕业设计 简历项目 项目经验(后端)_哔哩哔哩_bilibiliSpringboot项目实战 easypan 仿百度网盘 计算机毕业设计 简历项目 项目经验(后端)共计28条视频,包括:项目简介、项目架构、环境配置等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV1qV4y1d7zY

    在哔哩哔哩闲逛看到这个项目,感觉还不错,于是想要学习一下这个项目怎么写。项目日记也会同步更新。(本人不分享本项目源码,支持项目付费) 

本项目大量采用了先前项目中已经写好的代码,而且UP主讲的也很快。因此不适合新手作为自己的第一个项目。 

前段时间去赶学校的另外一个项目了,所以这个项目断更了一段时间,接下来的这段时间会主力把这个项目写完。

目录

前言:

​编辑今日完结任务:

1.创建完文件的表结构:

2.完成根据条件分页查询用户文件接口

3.文件的分片上传

1.秒传业务:

 2.分片上传业务

总结:


今日完结任务:

1.创建完文件的表结构:

 

2.完成根据条件分页查询用户文件接口

 这个接口比较烦,一句话概括查询条件为:需要查询指定分类指定用户指定类型文件

所以我们先构建一个FileinfoQuery类来统一存储查询条件:

接下来我们看看这个controller层:

整个controller层的逻辑为:先构造好查询条件类,然后携带查询条件类进入sever层进行查询

 sever层:

3.文件的分片上传

简单的讲一下文件分片上传的思路:当我们前端接收到一个大文件的时候,前端会把这个文件进行切分。告知后端一共切了几个分片以及当前上传的是哪一个分片。

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

先看接口层:

 接下来让我们来进入服务层:

服务层的逻辑比较复杂,因此我们先来介绍一下整个服务层对分片上传的处理逻辑的逻辑:

1.后端接收目标文件的MD5值,凭借MD5值在数据库中查找是否已经存在当前文件,如果存在的话,不需要接收分片上传,直接从数据库中拷贝一份即可秒传)。核心逻辑为:

2.如果当前文件不存在的话,就开始接收分片文件。核心逻辑为:

相信图片已经能很清晰的表明我们是如何接收分片文件的了。经过我们的概括,其实分片上传业务层可以分为两个大的板块:秒传业务分片上传业务

我们来看一看具体的代码:

1.秒传业务:

如果【拷贝数据大小 + 用户当前已使用的大小 > 用户云盘总空间】 则抛出异常,不允许拷贝数据。

如果满足条件的话,就开始拷贝数据:

 2.分片上传业务

接下来开始保存分片文件

当我们接收到最后一个分片文件的时候,需要异步合并所有的分片文件。

这里还有一个需要注意的地方,因为这个方法涉及到了修改大量的数据库字段,所以我们添加了给这个方法添加了事务。

而我们又使用了这个方法,注册了一个同步器,表示在当前事务提交之后,异步执行合并文件的方法(transferFile) ,但是如果我们直接使用这个transferFile方法的话,异步是不会生效的,因为他没有交给Spring 管理。

所以我们需要在FileInfoService中去依赖注入一个FileInfoService,将他交给Spring 容器进行管理。

但如果只是这样简单写的话,就会造成循环依赖了:

所以我们要给我们这个注解手动添加一个@Lazy注解,形成懒加载。

 那么这样的话,我们的分片上传业务就写完了。后面我会更新一下合并文件的transferFile方法

 小知识点:

1.因为文件的分片会很多,所以我们是把文件的大小,用户空间大小,用户已使用的空间大小放到Redis中去存储的。这样可以避免频繁的查询数据库字段。

 


2.Nginx和Spring boot自身就对上传和接收的文件大小限制有限制,因此如果我们的分片文件大小大于Nginx和Spring boot的本身限制,我们就要修改这两个的接收文件大小限制或者修改分片大小,否则就会报错

Nginx: 

在service下添加参数:client_max_body_size

Spring boot:

spring.http.multipart.maxFileSize=xxMb
spring.http.multipart.maxRequestSize=xxMb

总结:

        这篇文章是分两天写完的,分片上传的业务逻辑很复杂,调用的方法也很多,写的我心力憔悴。不过确实学习到了很多的东西。因此我一定要把这块逻辑搞清搞懂。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一盘牛肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值