首页 > 其他分享 >SpringBoot集成文件 - 大文件的上传(异步,分片,断点续传和秒传)

SpringBoot集成文件 - 大文件的上传(异步,分片,断点续传和秒传)

时间:2023-11-08 09:22:39浏览次数:44  
标签:异步 SpringBoot 文件 e4% 断点续传 分片 上传

1. 知识准备

大文件的上传技术手段和普通文件上传是有差异的,主要通过基于分片的断点续传和秒传和异步上传解决。

#1.1 大文件面临的问题

  1. 上传速度慢 -- 应对: 分块上传
  2. 上传文件到一半中断后,继续上传却只能重头开始上传 -- 应对: 断点续传
  3. 相同文件未修改再次上传, 却只能重头开始上传 -- 应对: 秒传

#1.2 基于分片的断点续传和秒传

当我们上传的文件很大时,对大文件的处理通常通过分片上传、断点续传和秒传技术手段实现。

  • 分片上传

分片上传就是将一个大文件分成若干份大小相等的小块文件,等所有小块文件上传成功后,再将文件进行合并成完整的原始文件。

  • 断点续传

断点续传就是重新上传文件时先判断哪些文件块已经上传过了(比如将分片的chuck md5等信息保存在DB中),如果上传过了则跳过这些块,否则上传没有上传的块。

  • 秒传

当用户选择上传一个文件时,服务端检测该文件之前是否已经被上传过,如果服务器已经存有该文件(完全一样),就立马返回前端 “文件已上传成功”。前端随即将进度条更新至100%。 这样给用户的感觉就是 “秒传” 的感觉。

#1.2.1 前后端该怎么做?

对于分片上传,前后端分别需要怎么做呢?

  1. 前端:需要将文件file.slice()成多个文件块,并计算每一块的md5值,每次请求上传都是传一个小文件块。
  2. 后端:需要接收每次上传的文件块并保存文件块的信息(比如md5), 如果已经上传则跳过;最后等所有文件上传完成之后,将所有的文件块合并成一个大文件。

#1.3 异步上传

当我们上传的文件很大,后台需要处理的时间很长,用户期望切换到其它页面继续工作,而不需要等待完成。这时候我们可以采用异步上传的方式。

在SpringBoot中将一个方法声明为异步方法非常简单,只需两个注解即可@EnableAsync@Async

  1. @EnableAsync用于开启SpringBoot支持异步的功能,用在SpringBoot的启动类上。
@SpringBootApplication
@EnableAsync // 这里
public class App {
 
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
 
  1. @Async用于方法上,标记该方法为异步处理方法。
@Service
public class UserServiceImpl {
 
    @Async // 这里带@Async的方法,会被当成一个子线程
    public void processFile(InputStream inputStream) {
        
    }
}
   

参考文章:http://blog.ncmem.com/wordpress/2023/11/08/springboot%e9%9b%86%e6%88%90%e6%96%87%e4%bb%b6-%e5%a4%a7%e6%96%87%e4%bb%b6%e7%9a%84%e4%b8%8a%e4%bc%a0%e5%bc%82%e6%ad%a5%ef%bc%8c%e5%88%86%e7%89%87%ef%bc%8c%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0/

欢迎入群一起讨论

 

 

标签:异步,SpringBoot,文件,e4%,断点续传,分片,上传
From: https://www.cnblogs.com/songsu/p/17816568.html

相关文章

  • Linux文件系统的功能规划
    对于运行的进程来说,内存就像一个纸箱子,仅仅是一个暂存数据的地方,而且空间有限。如果我们想要进程结束之后,数据依然能够保存下来,就不能只保存在内存里,而是应该保存在外部存储中。就像图书馆这种地方,不仅空间大,而且能够永久保存。我们最常用的外部存储就是硬盘,数据是以文件的形式保存......
  • 获取文件大小或文件夹的大小和占用空间,以及文件全路径、目录、扩展名、文件名称
    获取文件或文件夹的大小大小是文件夹/文件本身的实际大小,占用空间指的是文件夹/文件在磁盘中所占用的空间的大小。获取指定目录下所有文件的大小1//得到指定目录下的数据量大小2publicstaticlongGetDirectoryLength(stringdirPath)3{......
  • zip文件压缩解压
    zip文件压缩解压使用python操作zip文件,压缩和解压。压缩压缩文件时,可以将压缩文件保存在本地或保存在内存中,将压缩文件保存在内存中时,方便后续使用,比如直接返回给前端,也就不用再执行删除操作。importzipfilefrompathlibimportPathfromioimportBytesIOdefzip_......
  • Vitis IDE2022 打开之前已经开过的项目文件
    【File】-【Import...】-【Eclipseworkspaceorzipfile】-【next】-【Browse】-【Finish】......
  • 【Azure Key Vault】是否有直接方法将Azure Key Vault中的机密名称/机密值到处成文件
    问题描述是否有直接方法将AzureKeyVault中的机密名称/机密值导出,保存为一个文件呢? 问题解答AzureKeyVault没有直接提供Secret导出文件(如xlsx格式)的方式或者工具。不过可以通过SDK将Secret列举出来并获取到所有的密钥对,保存为所需要的文件格式。在Secrets页面即有各种语言的......
  • 文件的读写操作
    文件读写用途:数据存储和持久化:将应用程序中的数据写入文件,使得数据在程序退出后仍然存在,从而实现数据的持久化数据共享:将数据写入文件后,其他应用程序或系统可以读取并共享这些数据,实现数据的共享和交流配置文件:许多应用程序使用配置文件存储用户设置和参数,以便在下次运行时使......
  • 基于springboot+vue开发的教师工作量管理系
    教师工作量管理系springboot31摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了教师工作量管理系统的开发全过程。通过分析教师工作量管理系统管理的不足,创建了一个计算机管理教师工作量管理系统的方案。文章介绍了教师工作量......
  • 【Azure Key Vault】是否有直接方法将Azure Key Vault中的机密名称/机密值到处成文件
    问题描述是否有直接方法将AzureKeyVault中的机密名称/机密值导出,保存为一个文件呢? 问题解答AzureKeyVault没有直接提供Secret导出文件(如xlsx格式)的方式或者工具。不过可以通过SDK将Secret列举出来并获取到所有的密钥对,保存为所需要的文件格式。在Secrets页面即有各种......
  • 网安--Linux文件
    Linux中万物皆文件,以文件的形式存在,配置、文档、U盘或者是都是以文件的形式存在的Linux操作系统没有分盘,以根目录开始,树状结构/root根目录下的目录介绍:/bin:存放最常用的使用命令/boot:存放启动Linux时使用的核心文件,包括一些镜像文件。/dev:该目录存放Linux的外部设备,在Linu......
  • DocTemplateTool - 可根据模板生成word或pdf文件的工具
    你是否经常遇到这样的场景:产品运营有着大量的报告需求,或者给客户领导展现每周的运营报告?这些文档类的任务可以交给运营同事,他们负责文档排版和样式,你作为开发人员你只需要提供数据源,和一个映射表,告诉制作文档的人哪些字段可供使用。这样一来分工明确,减少了很多不必要的沟通成本。......