Java Spring Boot+vue3文件管理系统

前言

面试的时候老是被问,大文件上传逻辑,所以花了一天的时间实现了这个功能,登录+jwt认证+普通文件上传+大型文件上传

开始

演示效果

架构流程

复制代码
1. 不能直接file.arrayBuffer()读取文件信息 使用slice Blob进行切片,得到chunks数组 合并所有块的数据内容,增量计算哈希[不会累积内存],得到文件的id【为秒传做准备,和文件做唯一性】 

2. 准备工作完成,可以开始上传

3. 
3-1.先请求秒传接口,查询文件是否在服务器存在

3-2.初始化分片上传接口
   - 是否已有上传记录【查redis】,得到上传id,分片大小,已上传分片 {id:xxx, size:121, chunk: [1,2,3,4]}

3-3.上传分片
   - 查询已上传分片[跳过]
   - 请求分片接口, 获取上传信息[redis]
   - 保存分片文件【根据 uploadId 创建临时分片目录,然后把当前上传的 chunk 保存到对应文件】
    temp
    └── a8f93c9d7e2b4f5a8c9d123456789abc 
       ├── 0.chunk 
       ├── 1.chunk 
       ├── 2.chunk 
    更新redis已上传分片

上传完分片就自动执行下面
3-4.合并文件
    - 请求合并文件接口
        - 先获取上传信息 检查秒传【查询服务器是否存在】
        - 合并文件[创建目录,合并分片,进库,删除临时分片]

              用户选择文件
                    |
                    v
          File对象(不读取全部内容)
                    |
                    v
        Blob.slice 文件切片
                    |
                    v
        增量计算文件Hash(MD5/SHA256)
                    |
                    v
              fileId
                    |
        +-----------+------------+
        |                        |
        v                        v
    秒传检查                初始化上传
        |                        |
 已存在直接返回          创建uploadId
        |                        |
        v                        v
       完成                  上传分片
                                  |
                                  v
                         查询已上传chunk
                                  |
                          跳过已经上传
                                  |
                                  v
                         上传当前chunk
                                  |
                                  v
                         Redis记录状态
                                  |
                                  v
                         全部分片完成
                                  |
                                  v
                         请求合并文件
                                  |
                                  v
                    合并 -> 入库 -> 删除临时文件

项目地址

相关推荐
程序员黑豆1 小时前
Java包装类:基本类型与对象的桥梁
java·前端·ai编程
hsjiasb4 小时前
FreeRTOS学习(二十七)——任务栈与栈溢出检测
开发语言·stm32·学习·学习笔记·freertos
丰锋ff4 小时前
3.1 Qt事件之事件处理器
开发语言·qt
多弗朗皮卡丘5 小时前
C语言梦开始的地方7:函数
c语言·开发语言
mldong5 小时前
"applicant" 契约:退回发起人的闭环设计
java·架构
月华路5 小时前
G1 垃圾回收:脏卡队列、记忆集与并发精化线程机制
java·开发语言
gugucoding5 小时前
47. 【Java】Java内存模型(JMM)与可见性
java·开发语言
m0_380743876 小时前
从零调用 Claude 教程
开发语言·python·node.js
起床学FPGA6 小时前
AI回答问题之后,会自动跳到最下面的问题
开发语言·javascript·ecmascript
zww89491116 小时前
校园跑腿系统开发实战指南:从需求分析到上线部署全流程解析
java