首页 > 其他分享 >SpringBoot实现对文件的断点续传和秒传

SpringBoot实现对文件的断点续传和秒传

时间:2023-10-25 09:35:20浏览次数:29  
标签:断点续传 SpringBoot FileConstant 文件 redisUtil param FILE 上传

本文断点续传文件思路:

  1. 前端(客户端)需要根据固定大小对文件进行分片,请求后端(服务端)时要带上分片序号和大小;
  2. 服务端创建conf文件用来记录分块位置,conf文件长度为总分片数,每上传一个分块即向conf文件中写入一个127,那么没上传的位置就是默认的0,已上传的就是Byte.MAX_VALUE 127(这步是实现断点续传和秒传的核心步骤);
  3. 服务器按照请求数据中给的分片序号和每片分块大小(分片大小是固定且一样的)算出开始位置,与读取到的文件片段数据,写入文件。

分片上传/断点续传测试验证:

1、分片上传

 

2、断点续传

演示步骤:

a、文件上传一定大小,关闭浏览器,模拟中断,此时上传服务器中会有如下内容:

 

 打开conf文件,会有如下内容:

 

其中小方形为已经上传的块号

b、浏览器继续上传同一份文件

 

 

 

秒传

1、什么是秒传

通俗的说,你把要上传的东西上传,服务器会先做MD5校验,如果服务器上有一样的东西,它就直接给你个新地址,其实你下载的都是服务器上的同一个文件,想要不秒传,其实只要让MD5改变,就是对文件本身做一下修改(改名字不行),例如一个文本文件,你多加几个字,MD5就变了,就不会秒传了。

2、本文实现的秒传核心逻辑

  a、利用redis的set方法存放文件上传状态,其中key为文件上传的md5,value为是否上传完成的标志位;

  b、当标志位true为上传已经完成,此时如果有相同文件上传,则进入秒传逻辑。如果标志位为false,则说明还没上传完成,此时需要在调用set的方法,保存块号文件记录的路径,其中key为上传文件md5加一个固定前缀,value为块号文件记录路径。

3、核心代码逻辑

private boolean setUploadProgress2Redis(FileUploadRequestDTO param, String uploadDirPath,
      String fileName, File confFile, byte isComplete) {

    RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
    if (isComplete == Byte.MAX_VALUE) {
      redisUtil.hset(FileConstant.FILE_UPLOAD_STATUS, param.getMd5(), "true");
      redisUtil.del(FileConstant.FILE_MD5_KEY + param.getMd5());
      confFile.delete();
      return true;
    } else {
      if (!redisUtil.hHasKey(FileConstant.FILE_UPLOAD_STATUS, param.getMd5())) {
        redisUtil.hset(FileConstant.FILE_UPLOAD_STATUS, param.getMd5(), "false");
        redisUtil.set(FileConstant.FILE_MD5_KEY + param.getMd5(),
            uploadDirPath + FileConstant.FILE_SEPARATORCHAR + fileName + ".conf");
      }

      return false;
    }
  }

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/25/springboot%e5%ae%9e%e7%8e%b0%e5%af%b9%e6%96%87%e4%bb%b6%e7%9a%84%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%e5%92%8c%e7%a7%92%e4%bc%a0/

欢迎入群一起讨论

 

 

标签:断点续传,SpringBoot,FileConstant,文件,redisUtil,param,FILE,上传
From: https://www.cnblogs.com/songsu/p/17786349.html

相关文章

  • SpringBoot路径匹配
    Spring5.3之后加入了更多的请求路径匹配的实现策略;以前只支持AntPathMatcher策略,现在提供了PathPatternParser策略。并且可以让我们指定到底使用那种策略。1.Ant风格路径用法Ant风格的路径模式语法具有以下规则:*:表示任意数量的字符。?:表示任意一个字符。**:表示......
  • springboot生成二维码的正确姿势-附视频附源码
    @目录前言初始化SpringBoot项目引入依赖编码编写工具类生成二维码资源共享二维码的原理是什么,如何保证不重复?你有没有想过这样一件事,二维码是实现原理是什么?如何保证各个平台的二维码是唯一的?就算你的程序停止运行,但是你的二维码依然存在。设计上要保证唯一性,比如在物流等环......
  • 文件
    2023.10.241.文件分为文本文件和二进制文件,计算机只认识二进制,所以实际上都是二进制的不同解释方式。文本文件是以不同编码格式显示的字符,例如Ascii、Unicode等,window中文本文件的后缀名有".txt",".log",各种编程语言的源码文件等;二进制文件就是用文本文档打开是看不懂乱码,只要能......
  • Linux第二章:文件权限管理
    文件类型和扩展名文件种类常规文件纯文本文件(ASCII)二进制文件(binary)数据文件(data)在ls-al显示属性为[-]目录在ls-al显示属性为[d]链接文件区块设备文件:[b]字符设备文件:[c]数据接口文件:[s]数据输送文件FIFO:[p]扩展名Linux文件没有所谓的扩展......
  • Linux系统如何快速批量创建、删除文件
    1.首先,我们先找一个目录,蜜蜂这里就直接在根目录下演示了(建议刚入门的小伙伴们重新建一个新目录)2.然后用awk拿到这个文件里面的第九列(这是一个文件名)[root@bee~]#awk '{print$9}'test.txt 3.新建文件,这就新建了一堆文件[root@bee~]#awk '{print$9}'test.txt|xargstou......
  • [转]VS2019生成项目文件.lib或.dll或exe后如何拷贝到指定的目录文件夹
    VS2019编译CloudCompare,发现生成的项目文件都是分开的,每个项目下都有自己的文件夹Debug/Release,生成Dll都放在这些单独的项目文件夹内。目标(1)通常,我们要求所有的dll和.exe都在同一个文件夹,这样调试的时候就不用再去拷贝或设置环境变量,直接设置任意.exe项目为启动项目就能调试了......
  • [转]Oracle数据文件损坏的模拟和修复(一) |ORA-01578 data block corrupted|
    造成数据块损坏的原因通常是由于开启了异步I/O或者增加了写进程,还有可能是硬件引起的,今天模拟一下该问题的发生及修复方法。由于水平有限,那面疏漏,欢迎大家指正。 创建测试环境建立测试表空间:123456create tablespacetestdatafile  '/u02/oradata/logdw......
  • 每天一道面试题:Linux下查找文件并删除的命令
    找到目录下所有一test开头的文件并删除:1.find./-name"test*"|xargsrm-rf2.find./-name"test*"-execrm-rf{}\;3.rm-rf$(find./-name"test*")如果想指定递归深度,可以这样:1.find./-maxdepth3-name"*.txt"|xargsrm-rf2. fi......
  • Java基础 字节缓冲流、字节缓冲流拷贝文件
    字节缓冲流:原理:底层自带了长度为8192的缓冲区。利用缓冲区可以一次读写8192个字节,从而提高性能public BufferedInputStream(InputStream is)  →  把基本流包装成高级流,提高读取数据的性能public BufferedOutputStream(OutputStream os)  →  把基本......
  • Go的文件操作:读写文件与IO接口
    大家好!我是[lincyang]。今天我们要一起探讨Go语言中的文件操作,特别是读写文件和IO接口。什么是文件操作?文件操作是编程中不可或缺的一部分,涉及到数据的读取、写入、删除等。在Go语言中,这些操作主要通过os和io两个标准库来完成。为什么要进行文件操作?数据持久化:程序运行结束......