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

项目地址

相关推荐
小马哥程序开发6 分钟前
[点赞收藏免费领取 · 项目源码]57105基于Spring Boot的充电桩管理系统的设计与实现
java·spring boot·源码·课程设计·毕设·大作业·课设
程序猿编码23 分钟前
C++/CUDA 手写 LLM 推理引擎:拆解 vLLM 核心 PagedAttention 与连续批处理
开发语言·c++·深度学习·神经网络·推理·vllm
hold?fish:palm29 分钟前
44 二叉搜索树中第K小的元素
开发语言·c++·算法
九皇叔叔37 分钟前
【09】SpringBoot4 MyBatisPlus 增删改查(CRUD)
java·mybatis·mybatisplus
凉茶钱44 分钟前
【吃透C++】万字解析类和对象
开发语言·c++
白杨尚青1 小时前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
可乐鸡翅yeah_1 小时前
hls.js 切换多个视频源,新手开发常见踩坑
开发语言·前端·javascript·ios·ffmpeg·音视频·safari
Tanshu_API君1 小时前
API 聚合平台选型指南:从参数拆解到生产落地的十个评估维度
开发语言·api
Chen—LSN1 小时前
C语言——⽂件操作(1)
c语言·开发语言·c++·经验分享·笔记·算法·链表
狗凯之家源码网1 小时前
PHP 开源 IM 即时通讯系统效果实测与功能展示
开发语言·开源·php