springboot 大文件分片上传

springboot 大文件分片上传

  • constant
  • entity
  • vo
  • controller
  • utils

在这里插入图片描述

大文件分片上传是一种将大文件分割成多个小文件片段,然后分别上传这些小文件片段的方法。这种方法的好处包括:

  1. 减少重新上传开销:如果网络传输中断,只需重传未上传的部分,而不是整个文件。

  2. 提高灵活性:分片大小可以根据实际情况调整,以平衡上传速度和请求次数。

  3. 支持断点续传:服务器可以记录已经上传的文件块,以便在中断后继续上传。

分片上传的流程大致如下:

  1. 文件分片:首先,对文件进行分片,每个分片的大小可以根据实际情况设定,例如,一个100MB的文件可以分成每个5MB的分片,共20个分片。

  2. 计算MD5值:对每个分片计算MD5值,这有助于文件的完整性校验和唯一标识。(这里使用【文件名+文件后缀+文件大小+时间戳】的方式,对当前文件生成了MD5,用来区分不同的文件,保证文件的唯一性。)

  3. 上传分片:将每个分片和它的MD5值一起上传到服务器。

  4. 服务器校验:服务器接收每个分片并进行校验,确保分片的完整性和正确性。(这里只在文件合并的时候,对文件片数的完整性进行校验。)

  5. 文件合并:当所有分片都成功上传后,服务器将它们合并成完整的文件。

在选择分片大小时,需要权衡请求次数和灵活性。分片太小会增加请求次数和开销,而分片太大则可能减少灵活性。通常,服务器端会有一个固定大小的接收Buffer,分片的大小最好是这个值的整数倍。

此外,前端在开始上传前需要对文件名进行校验,确保文件名不超过最大长度,否则禁止发送请求。

constant

/**
 * 文件上传类型常量类
 **/
public interface FileUploadTypeConstant
{
   

    /**
     * 单文件上传
     */
    String SINGLE = "single";

    /**
     * 分片上传
     */
    String CHUNKS = "chunks";

    /**
     * 文件合并
     */
    String MERGE = "merge";
}

entity

/**
 * @Description 前端统一返回类
 **/
public class ResResult<D>
{
   
    /**
     * 0 为成功,1为失败
     */
    public static final String SUCCESS = "0";
    public static final String FAIL = "1";

    private String code;
    private D data;
    private String msg;

    private ResResult(String code)
    {
   
        this.code = code;
    }

    public static <T> ResResult<T> get(String code)
    {
   
        return new ResResult<>(code);
    }

    public static <T> ResResult<T> success()
    {
   
        return new ResResult<T>(SUCCESS).setMsg("操作成功");
    }

    public static <T> ResResult<T> success(T data)
    {
   
        return new ResResult<T>(SUCCESS).setMsg("操作成功").setData(data);
    }

    public static <T> ResResult<T> success(String msg)
    {
   
        return new ResResult<T>(SUCCESS).setMsg(msg);
    }

    public static <T> ResResult<T> success(String msg, T data)
    {
   
        return new ResResult<T>(SUCCESS).setMsg(msg).setData(data);
    }

    public static <T> ResResult<T> fail()
    {
   
        return new ResResult<T>(FAIL).setMsg("操作失败");
    }

    public static <T> ResResult<T> fail(String msg)
    {
   
        return new ResResult<T>(FAIL).setMsg(msg);
    }

    public static <T> ResResult<T> fail(String msg, T data)
    {
   
        return new ResResult<T>(FAIL).setMsg(msg).setData(data);
    }

    public static <T> ResResult<T> fail(T data)
    {
   
        return new ResResult<T>(FAIL).setMsg("操作失败").setData(data);
    }

    public D getData()
    {
   
        return this.data;
    }

    public ResResult<D> setData(D data)
    {
   
        this.data = data;
        return this;
    }

    public String getCode()
    {
   
        return code;
    }

    public ResResult<D> setCode(String code)
    {
   
        this.code = code;
        return this;
    }

    public String getMsg()
    {
   
        return msg;
    }

    public ResResult<D> setMsg(String msg)
    {
   
        this.msg = msg;
        return this;
    }

    /**
     * 重载空参for 跨服务调用实例化该类用的构造函数
     */
    private ResResult()
    {
   
    }
}

vo

/**
 * 分片文件对象
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FileChunkVO
{
   
    /**
     * 文件MD5校验值
     */
    String md5Check;
    /**
     * 当前分片编号
     */
    int chunkNumber;
    /**
     * 总分片数
     */
    int totalChunks;
    /**
     * 文件名称
     */
    String fileName;

    /**
     * single:单文件;
     * chunks:分片;
     * marge:合并
     */
    String type;
}

controller

包括三个方法,分别是:单文件上传,文件分片上传,文件合并。

    /**
     * 文件上传
     *
     * @param fileChunkVO   分片文件对象
     * @return ResResult对象,表示上传结果
     */
    @ApiOperation(value = "文件上传")
    @PostMapping("/upload")
    public ResResult<?> upload(MultipartFile file, FileChunkVO fileChunkVO)
    {
   
        try
        {
   
            switch (fileChunkVO.getType())
            {
   
            case FileUploadTypeConstant.SINGLE:
                List<Map<String, Object>> list = FileUtils.uploadFiles(new MultipartFile[]
                {
    file },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/489150.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机Linux-openEuler硬盘空间扩容

虚拟机Linux-openEuler硬盘空间扩容 1、需求场景 我们在使用虚拟机时&#xff0c;可能会出现磁盘空间不够用导致各种bug出现的情况。 首先&#xff0c;我们要扩展虚拟机的可用磁盘空间。如图所示&#xff0c;我的原本硬盘大小为8G&#xff0c;我们扩展到30GB 2、打开虚拟机…

关于克拉美罗下界(CRLB)-及不同DOA估计算法下的方差(性能)对比

说明 参数估计在科研、工程乃至生活中都有广泛的应用。参数估计要解决的问题简单来说就是&#xff1a;基于一组观测数据&#xff0c;通过某种方法来获得我们想要的&#xff0c;与观测数据相关的一个或多个参数。 克拉美-罗界(Cramr-Rao Bound, CRB)是无偏估计里我们常用的且十分…

2015年认证杯SPSSPRO杯数学建模B题(第一阶段)替换式密码全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 B题 替换式密码 原题再现&#xff1a; 历史上有许多密码的编制方法。较为简单的是替换式密码&#xff0c;也就是将文中出现的字符一对一地替换成其它的符号。对拼音文字而言&#xff0c;最简单的形式是单字母替换加密&#xff0c;也就是以每个…

sql Tuning Advisor启用导致业务性能问题

数据库每天晚上10点后业务性能很卡&#xff0c;大量的insert被堵塞&#xff0c;查询等待事件发现有大量的“library cache lock”和“cursor: pin S wait on X”。 22:00数据库的统计信息开始收集&#xff0c; Sql Tuning Advisor堵塞了统计信息的收集&#xff0c;等待事件是“…

GitHub上非常火热的开源低代码开发平台:ILLA Builder,接近1万star!快速构建内部工具的利器

摘要&#xff1a;本文介绍了 ILLA Builder&#xff0c;一个在 GitHub 上非常火热的开源低代码开发平台&#xff0c;它可用于快速构建内部工具。我们将探讨 ILLA Builder 的功能、特点和使用方法&#xff0c;以及它在低代码编程领域的优势。 一、引言 在企业发展的过程中&#x…

Nextcloud激活被锁用户

Nextcloud激活用户 如果docker下没有安装sudo 和 vim执行下面命令&#xff0c;安装了则跳过 #进入docker内部 #更新apt-get apt-get update #安装sudo apt-get install sudo #安装vim apt-get install vim 修改下面文件内容&#xff0c;否则执行occ命令可能报错 进入上面查询…

STM32看似无法唤醒的一种异常现象分析

1. 引言 STM32 G0 系列产品具有丰富的外设和强大的处理性能以及良好的低功耗特性&#xff0c;被广泛用于各类工业产品中&#xff0c;包括一些需要低功耗需求的应用。 2. 问题描述 用户使用 STM32G0B1 作为汽车多媒体音响控制器的控制芯片&#xff0c;用来作为收音机频道存贮…

电子显微镜——相机

相机种类 相机种类繁多,下面根据相机接口和图像传感器类型进行分类。 根据数据接口分类 1. USB相机 USB相机通常可以指代多种不同类型的USB接口相机,其中包括UVC(USB Video Class)相机和U3V(USB3 Vision)相机等,它们通常使用SOC进行开发。以下是它们的区别和特点: …

Java版AI人工智能源码 Chat GPT智能AI源码

Java版AI人工智能源码 Chat GPT智能AI源码 技术框架 基于前后端分离架构以及Vue3、uni-app、SpringBoot2.5技术栈开发&#xff0c; 包含PC端、H5端、小程序端、APP端。 AI人工智能系统介绍 Chat GPT AI人工智能系统聚合对接国内外知名主流大语言模型接口及中转平台&#x…

100WQR80-15-7.5_耐高温潜水排污泵

在现代工业生产中&#xff0c;对设备的耐高温性能要求越来越高。特别是在涉及液体排放和污水处理的场合&#xff0c;不仅需要设备有强大的排污能力&#xff0c;还要求能在极端高温环境下稳定运行。面对这一挑战&#xff0c;我们隆重推出100WQR80-15-7.5型号的耐高温潜水排污泵&…

【日常记录】【CSS】css文字渐变擦除

文章目录 1、代码2、自定义css属性 1、代码 主要思路是&#xff1a; 1、弄一个一样的&#xff0c;覆盖到上面去 2、然后改一下文字颜色&#xff0c;改成透明&#xff0c;背景颜色改成 渐变&#xff0c;可以从透明到一个实色&#xff0c;这样就能显示出来下面的文字 3、只有 行内…

Redis实现排行榜功能实战

前言 在日常的服务器开发过程中&#xff0c;经常会遇到排行榜的需求。这里我们主要讨论使用redis zset来实现一般的常用排行榜。也就是单key排行榜&#xff0c;分数为整数&#xff0c;一般长度不过万。 ZSet概述 Redis的ZSet&#xff08;Sorted Set&#xff09;是一种有序集…

谷歌AI搜索惊现恶意网站推荐!用户安全再遭威胁?

近日&#xff0c;谷歌推出的新搜索生成体验(SGE)功能引发广泛关注。然而&#xff0c;这一旨在提升搜索体验的AI功能却陷入了争议&#xff0c;有报道称其可能在生成的响应中推广欺诈网站和恶意软件&#xff0c;为用户带来安全风险。 AI-321 | 专注于AI工具分享的网站 AI工具集 …

文件的介绍

文件介绍 文件是计算机中用于存储数据的一种载体。一般储存在磁盘上。 文件通常以一定的格式和结构存储数据&#xff0c;可以包含文本、图像、音频、视频等各种类型的信息。 文件可以通过文件系统进行管理和组织&#xff0c;用户可以对文件进行创建、打开、编辑、保存、复制…

Chrome 插件各模块之间的消息传递

Chrome 插件各模块之间的消息传递 一、消息传递 1. 消息传递分类 Chrome 插件的 Action、Background 和 content_script 三个模块之间的信息传输插件和插件之间的信息传输网页向插件进行信息传输与原生应用进行消息传递 2. 消息传递 API runtime API runtime.sendMessage(…

新房装修后,经验总结和坑点复盘

房子装修的时候&#xff0c;谁在盯着你的钱包&#xff1f;谁想从你这里捞钱&#xff1f;一是负责签合同的装修公司&#xff0c;二是负责实际装修的工地工头。装修公司要从你这份合同里为公司赚取运营成本和利润&#xff0c;工地装修工头要从你这里赚取他私人的利益。 在签合同…

C语言例4-13:已知圆柱体的底半径是1.5,高是2.0,计算其体积并输出。

代码如下&#xff1a; //已知圆柱体的底半径是1.5&#xff0c;高是2.0&#xff0c;计算其体积并输出。 #include<stdio.h> #define PI 3.1415926 int main(void) {float radius1.5, high2.0,vol;vol PI*radius*radius*high; //计算圆柱体的体积printf("vol %7.…

jsonpath和json数据(序列化loads()、反序列化eval())及断言处理(断言封装)

jsonpath&#xff1a;对json串进行搜索 安装jsonpath 安装&#xff1a;pip install jsonpath 导入&#xff1a; from jsonpath import jsonpath jsonpath能通过简单的方式就能提取给定JSON中的字段。 jsonpath官方地址&#xff1a;https://goessner.net/articles/JsonPath/ 在…

AI视频渲染原理是什么?

一、AI渲染原理 AI视频渲染是一种结合了人工智能技术的新型渲染方式&#xff0c;它主要通过深度学习和其他机器学习方法来优化传统渲染流程&#xff0c;以提高效率和质量。以下是AI视频渲染可能涉及的一些基本原理&#xff1a; 1. **智能采样**&#xff1a; - AI可以帮助决定在…

Go第三方框架--gin框架(二)

4. gin框架源码–Engine引擎和压缩前缀树的建立 讲了这么多 到标题4才开始介绍源码&#xff0c;主要原因还是想先在头脑中构建起 一个大体的框架 然后再填肉 这样不容易得脑血栓。标题四主要涉及标题2.3的步骤一 也就是 标题2.3中的 粗线框中的内容 4.1 Engine 引擎的建立 见…