文件上传功能 - MVC架构详细流程图

📱 前端层(MVC → View层:视图展示与用户交互)
文件上传视图组件(三大核心功能)
【核心功能1:文件预处理与分片判断】
  • 上传控件:支持单文件/多文件选择(图片/视频格式)
  • 分片规则:判断文件大小,≥512KB则自动分片(每片512KB),<512KB则整体上传
  • MD5生成:对第一个分片(或整体文件)计算MD5值(作为文件唯一标识)
  • 分片封装:为每个分片添加标识(文件MD5、分片索引、总分片数、文件名、文件类型)
【核心功能2:上传交互与状态展示】
  • 交互项:“开始上传”按钮、“暂停上传”按钮、“取消上传”按钮
  • 展示项:上传进度条(整体进度/分片进度)、上传状态提示(待上传/上传中/上传成功/失败)
  • 结果展示:文件预览(原图/封面)、文件状态(转码中/可用)
【核心功能3:请求发送】
  • 接口1:/api/upload/precheck(文件预处理:传递文件MD5,查询是否已存在)
  • 接口2:/api/upload/chunk(分片上传:传递分片数据及标识信息)
  • 接口3:/api/upload/merge(合并分片:传递文件MD5、总分片数等,触发后端合并)
  • 前端逻辑:根据预处理结果决定是否上传(已存在则直接结束,不存在则上传分片)
🎯 后端Controller层(MVC → Controller层:请求分发与响应封装)
文件上传Controller(四大核心接口)
接口1:/api/upload/precheck(文件预处理接口)
  • 接收参数:文件MD5、文件名、文件类型、文件大小
  • 核心职责:传递参数给Service层,接收“文件已存在/不存在”结果,封装响应返回前端
接口2:/api/upload/chunk(分片上传接口)
  • 接收参数:分片文件流、文件MD5、分片索引、总分片数、文件名
  • 核心职责:封装分片信息传递给Service层,接收“分片上传成功/失败”结果,返回响应
接口3:/api/upload/merge(分片合并接口)
  • 接收参数:文件MD5、总分片数、文件名、文件类型
  • 核心职责:传递参数触发Service层分片合并逻辑,接收“合并成功/失败”结果,返回响应
接口4:/api/upload/status(上传/转码状态查询接口)
  • 接收参数:文件MD5
  • 核心职责:查询Service层返回文件状态(上传中/合并中/转码中/可用),返回给前端

核心特性:无业务逻辑,仅负责请求接入、参数校验/封装、响应返回,解耦前端与业务层

🔧 后端Model层(MVC → Model层:业务逻辑+数据访问)
1. 文件上传Service(业务逻辑层:核心业务处理)
【业务1:文件预处理(MD5查重)】
  • 步骤1:接收文件MD5参数,调用DAO层查询数据库中是否存在该MD5对应的文件记录
  • 步骤2:结果判断
    • 存在:返回“文件已存在,无需重复上传”结果,直接触发文件信息入库(若未完全入库)
    • 不存在:返回“文件不存在,需上传分片”结果,初始化分片上传记录(存入缓存/数据库)
【业务2:分片接收与存储】
  • 步骤1:接收分片信息,校验分片索引、总分片数是否合法
  • 步骤2:将分片文件存储至临时目录(或对象存储临时桶),并记录分片存储路径
  • 步骤3:更新分片上传状态(缓存/数据库中标记该分片已上传)
  • 步骤4:返回“分片上传成功”结果
【业务3:分片合并】
  • 步骤1:根据文件MD5查询所有分片,校验是否所有分片均已上传完成
  • 步骤2:若分片完整,按分片索引顺序合并所有分片,生成完整文件,存储至正式存储目录
  • 步骤3:删除临时目录中的分片文件,清理分片上传记录
  • 步骤4:合并完成后,触发后续异步处理(视频转码、封面生成)
  • 步骤5:返回“分片合并成功,正在处理文件”结果
【业务4:文件异步处理(ffmpeg)】
  • 子业务1:视频转码(生成m3u8)
    • 判断文件类型为视频,调用ffmpeg组件,将完整视频转码为HLS格式(生成m3u8索引文件+ts分片)
    • 存储转码后的m3u8文件及ts分片,记录存储路径
  • 子业务2:封面生成(图片/视频通用)
    • 图片文件:调用ffmpeg截取图片第一帧(或指定帧)作为封面,压缩后存储
    • 视频文件:调用ffmpeg截取视频第1秒帧(或指定帧)作为封面,压缩后存储
    • 记录封面文件存储路径
【业务5:文件信息入库与状态更新】
  • 步骤1:整理文件信息(MD5、文件名、文件类型、原文件路径、转码文件路径、封面路径、文件大小)
  • 步骤2:调用DAO层将文件信息存入数据库
  • 步骤3:更新文件状态为“可用”,返回最终处理结果

输出:返回各类业务处理结果(文件已存在/分片上传成功/合并成功/转码中/处理完成)

2. DAO层(数据访问层:数据库/缓存交互)
1. 文件信息DAO
  • 核心职责:仅负责文件核心信息的数据库交互,无业务逻辑
  • 核心接口:
    • findFileByMd5(String md5):根据文件MD5查询文件信息(判断是否已存在)
    • insertFileInfo(FileInfo fileInfo):插入文件完整信息(原文件、转码文件、封面路径等)
    • updateFileStatus(String md5, Integer status):更新文件状态(上传中/合并中/转码中/可用)
  • 实现方式:通过MyBatis/JPA执行SQL,操作MySQL等关系型数据库
2. 分片信息DAO
  • 核心职责:仅负责分片上传记录的数据库/缓存交互
  • 核心接口:
    • insertChunkRecord(ChunkRecord chunkRecord):初始化分片上传记录
    • updateChunkStatus(String md5, Integer chunkIndex):标记分片已上传
    • findAllChunkByMd5(String md5):查询该文件所有分片记录
    • deleteChunkRecord(String md5):分片合并后删除分片记录
  • 实现方式:小型系统用数据库,高并发系统用Redis(缓存分片状态)+ 数据库(持久化分片路径)
3. 数据存储层 + 辅助功能组件
  • 1. 数据存储模块
    • 关系型数据库(如MySQL):存储文件核心信息(MD5、文件名、路径、状态、封面路径等)、分片上传记录
    • 文件存储(本地磁盘/对象存储如MinIO/OSS):
      • 临时存储:存放未合并的分片文件(临时目录/临时桶)
      • 正式存储:存放合并后的原文件、转码后的m3u8/ts文件、封面文件
    • 缓存(如Redis):存储分片上传状态、文件处理状态(用于快速查询,提升性能)
  • 2. 辅助工具组件
    • MD5工具:计算文件/分片的MD5值(前端/后端共用统一算法)
    • 分片处理工具:负责分片的拆分(前端)、合并(后端)逻辑
    • FFmpeg工具:核心辅助组件,提供两大能力:
      • 视频转码:将MP4/AVI等格式转为HLS(m3u8+ts)格式,支持流媒体播放
      • 封面生成:为图片/视频截取指定帧生成封面,支持压缩优化
    • 异步任务框架(如Spring Task/XXL-Job):承载FFmpeg转码/封面生成的异步处理,避免阻塞主线程