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
                    合并 -> 入库 -> 删除临时文件

项目地址

相关推荐
云小逸几秒前
C++ 第一阶段:对象、内存与生命周期
开发语言·c++
玖玥拾16 分钟前
Lua 基础语法(二)
开发语言·unity·lua
王的宝库19 分钟前
GO常用标准库包
开发语言·后端·golang
geovindu35 分钟前
python: Face Recognition
开发语言·后端·python·人脸识别
我命由我1234541 分钟前
Windows 操作系统 - 启用 D 盘虚拟内存
java·运维·服务器·windows·学习·java-ee·运维开发
平头哥技术团队1 小时前
Day 13 | 调 line-height 和 margin:三处间距让名片页脱离模板感
开发语言·前端·javascript·学习·html5
xcl09251 小时前
智慧场馆解决方案系统源码:从架构设计到部署实战
java·spring boot
liangbo71 小时前
06-JVM垃圾回收器之CMS
java·jvm
黑马程序员毕设1 小时前
基于Java的仪器管理系统设计与实现
java·开发语言·spring boot·后端·微信小程序
平头哥AI1 小时前
Day 13 | 一个函数回两个值:Go 的 error 是从哪冒出来的
开发语言·后端·golang