【祈安云盘】文件上传

祈安云盘项目系列文章:
【启动】一个云盘项目——Java后端
【祈安云盘】系统设计+目录结构+用户数据库设计
【祈安云盘】图片验证码+邮箱验证码
【祈安云盘】注册登录完结



本篇文章终于正式开始文件部分!

一、文件数据库

首先设计文件数据库的ER图
在这里插入图片描述
接下来在navicate中设计file_info数据表
在这里插入图片描述
系统中应实现的文件管理功能包括:

文件上传:实现文件分片上传、秒传、断点续传、取消上传
文件分享:生成文件分享复制链接、取消分享、通过分享码查看文件列表、预览文件、保存到我的云盘
文件下载
文件在线预览:包括视频播放、音乐播放、图片预览、excel/doc/pdf预览
新建文件夹
文件删除:文件放入回收站
文件重命名
文件移动
回收站功能:文件还原、彻底删除

二、上传文件

首先实现上传文件功能。如果调用接口一次上传一个文件,那么如果文件上传过程出现中断,则无法继续上传,另外对于大文件来说,上传速度很慢。
那么将一个文件切分成多个小文件并行上传就可以解决上述问题,我们成为分片上传,流程如下图:
在这里插入图片描述

Controller层都只是定义了参数和调用service方法,所以我们直接讲解serviceImpl层。

  • 首先,方法接收会话用户信息、文件ID、文件对象、文件名、文件父ID、文件MD5值、分片索引和分片总数作为参数,并初始化临时文件夹对象和上传成功标志。
    在这里插入图片描述
  • 开始上传文件,出错则标记上传失败并记录错误日志、删除临时目录。
    在这里插入图片描述
  • 检查文件ID是否为空,如果为空则生成一个随机的文件ID,并设置到上传结果对象中,然后获取当前日期时间、用户空间使用情况;
    在这里插入图片描述
  • 如果当前分片是第一个分片,则查询数据库中是否存在相同MD5值的文件,如果存在,则执行秒传操作,将秒传结果设置到上传结果对象中,并更新用户空间使用情况;
    在这里插入图片描述
  • 创建临时文件夹存储分片文件,检查用户空间是否足够,并将上传的文件保存到临时目录中;如果当前分片不是最后一个分片,则设置上传结果为正在上传状态,并返回上传结果对象;
    在这里插入图片描述
  • 如果当前分片是最后一个分片,则记录文件信息到数据库中,标记文件为传输状态,并异步调用合并分片文件的方法;
    在这里插入图片描述

三、文件转码

在上面的流程中,所有的文件分片上传完成后,异步地对文件进行转码并合并文件,文件转码流程如下图:
在这里插入图片描述

为什么要转码而不是直接合并分片文件呢,因为希望实现文件缩略图功能。那么同上,直接看serviceImpl代码。

  • 初始化转码成功标志、目标文件路径和封面图片路径、文件类型枚举,并从数据库中根据文件ID和用户ID获取文件信息。
    在这里插入图片描述
  • 获取分片的临时目录、获取真实文件名和路径,合并文件
    在这里插入图片描述
    合并文件方法接受目录路径、目标文件路径、文件名和是否删除源文件作为参数,流程如下图:
    在这里插入图片描述
    合并文件的关键步骤为读取分片内容并写入目标文件中,由文件内容访问类RandomAccessFile实现。在这里插入图片描述
  • 根据文件后缀确定文件类型
  • 如果是视频文件,进行切割处理,然后生成视频缩略图
    在这里插入图片描述
    切割视频流程如下, 主要是基于FFmpeg的两条命令实现。
    在这里插入图片描述
    在这里插入图片描述
  • 如果是图片文件,使用FFmpeg生成缩略图
    在这里插入图片描述
  • 设置文件状态为转码成功或失败并更新文件信息
    在这里插入图片描述
    好的,至此【祈安云盘】最重要的功能——文件上传就完成了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值