祈安云盘项目系列文章:
【启动】一个云盘项目——Java后端
【祈安云盘】系统设计+目录结构+用户数据库设计
【祈安云盘】图片验证码+邮箱验证码
【祈安云盘】注册登录完结
本篇文章终于正式开始文件部分!
一、文件数据库
首先设计文件数据库的ER图
接下来在navicate中设计file_info数据表
系统中应实现的文件管理功能包括:
文件上传:实现文件分片上传、秒传、断点续传、取消上传
文件分享:生成文件分享复制链接、取消分享、通过分享码查看文件列表、预览文件、保存到我的云盘
文件下载
文件在线预览:包括视频播放、音乐播放、图片预览、excel/doc/pdf预览
新建文件夹
文件删除:文件放入回收站
文件重命名
文件移动
回收站功能:文件还原、彻底删除
二、上传文件
首先实现上传文件功能。如果调用接口一次上传一个文件,那么如果文件上传过程出现中断,则无法继续上传,另外对于大文件来说,上传速度很慢。
那么将一个文件切分成多个小文件并行上传就可以解决上述问题,我们成为分片上传,流程如下图:
Controller层都只是定义了参数和调用service方法,所以我们直接讲解serviceImpl层。
- 首先,方法接收会话用户信息、文件ID、文件对象、文件名、文件父ID、文件MD5值、分片索引和分片总数作为参数,并初始化临时文件夹对象和上传成功标志。
- 开始上传文件,出错则标记上传失败并记录错误日志、删除临时目录。
- 检查文件ID是否为空,如果为空则生成一个随机的文件ID,并设置到上传结果对象中,然后获取当前日期时间、用户空间使用情况;
- 如果当前分片是第一个分片,则查询数据库中是否存在相同MD5值的文件,如果存在,则执行秒传操作,将秒传结果设置到上传结果对象中,并更新用户空间使用情况;
- 创建临时文件夹存储分片文件,检查用户空间是否足够,并将上传的文件保存到临时目录中;如果当前分片不是最后一个分片,则设置上传结果为正在上传状态,并返回上传结果对象;
- 如果当前分片是最后一个分片,则记录文件信息到数据库中,标记文件为传输状态,并异步调用合并分片文件的方法;
三、文件转码
在上面的流程中,所有的文件分片上传完成后,异步地对文件进行转码并合并文件,文件转码流程如下图:
为什么要转码而不是直接合并分片文件呢,因为希望实现文件缩略图功能。那么同上,直接看serviceImpl代码。
- 初始化转码成功标志、目标文件路径和封面图片路径、文件类型枚举,并从数据库中根据文件ID和用户ID获取文件信息。
- 获取分片的临时目录、获取真实文件名和路径,合并文件
合并文件方法接受目录路径、目标文件路径、文件名和是否删除源文件作为参数,流程如下图:
合并文件的关键步骤为读取分片内容并写入目标文件中,由文件内容访问类RandomAccessFile实现。 - 根据文件后缀确定文件类型
- 如果是视频文件,进行切割处理,然后生成视频缩略图
切割视频流程如下, 主要是基于FFmpeg的两条命令实现。
- 如果是图片文件,使用FFmpeg生成缩略图
- 设置文件状态为转码成功或失败并更新文件信息
好的,至此【祈安云盘】最重要的功能——文件上传就完成了!