首页 > 其他分享 >springboot大文件上传、分片上传、断点续传、秒传的实现

springboot大文件上传、分片上传、断点续传、秒传的实现

时间:2023-11-16 10:15:25浏览次数:36  
标签:断点续传 springboot 文件 分片 MD5 上传 md5

本篇攻略将详细介绍如何使用Spring Boot实现大文件上传、分片上传、断点续传和秒传功能。为方便阅读,本文将分为以下几个部分:

  1. 介绍大文件上传、分片上传、断点续传和秒传的概念
  2. 详细分析如何实现大文件上传、分片上传、断点续传和秒传功能
  3. 给出两个示例来说明如何实现大文件上传和分片上传的功能

什么是大文件上传、分片上传、断点续传和秒传?

在进行大文件上传时,将整个文件一次性上传,存在诸多问题,例如:占用带宽、容易超时、无法暂停或继续等。

因此,常常将大文件分成多个片段进行上传,从而实现“分片上传”的目的,同时采用断点续传的功能,即使在上传过程中出现异常,也可以从上次中断的位置继续上传。当然,在上传时,还需要提供“秒传”功能,能够快速判断此文件是否已上传过,避免重复上传。

如何实现大文件上传、分片上传、断点续传和秒传?

在详细分析如何实现四大功能之前,需要了解一下采用的技术:

  1. 前端采用JavaScript语言,使用Ajax上传文件
  2. 后端采用Spring Boot框架和hutool工具类,处理上传的数据

实现思路如下:

  1. 对上传的文件进行MD5摘要,获取文件的唯一标识
  2. 判断该文件是否已上传过,如果上传过,则直接显示上传成功即可
  3. 判断此次上传是“分片上传”还是“完整上传”,如果是“分片上传”,将分片按顺序保存
  4. 判断文件是否上传完毕,如果上传完毕,则将分片进行合并即可

下面分别对四大功能进行详细分析。

大文件上传

大文件上传通常是将整个文件一次性上传到后端服务器,这样会存在许多问题,例如:占用带宽、超时等。因此,我们可以将大文件分成多个小片段进行上传。

具体来说,将大文件分成多个固定大小的分片,将多个分片上传到后端服务器,最后由后端将小文件合并成需要的完整文件。

分片上传

分片上传是将大文件分为固定的大小的小文件,例如1MB,每个小文件上传到后端服务器,最后由后端将所有分片整合成完整的文件,完成上传。

在分片上传过程中,我们需要记录每个分片的状态,以便在后续上传中恢复未上传完的分片。

断点续传

断点续传是在文件上传过程中出现异常时,能够从上次上传的位置继续上传,而不是重新上传整个文件。在上传过程中,利用分片上传的技术将上传的进度保存到本地,当上传异常时,可以通过断点进度继续上传,从而减少重复上传的数据量。

秒传

秒传是指在上传文件之前,通过文件的MD5值进行比对,如果需要上传的文件已经上传过了,那么就可以直接告诉前端这个文件已经上传成功,无需再次上传。

具体实现过程中,需要为每个上传的文件生成独一无二的MD5值,并与之前上传的所有文件的MD5值进行比对,判断此次上传是否为秒传。

实现大文件上传和分片上传的两个示例

示例1: 大文件上传

以下是使用Spring Boot实现大文件上传的示例代码:

//前端代码,使用Ajax上传文件,并附带MD5值
let formData = new FormData()
formData.append('file', file)
formData.append('md5', md5)

//后端代码,对上传的文件进行MD5处理
String md5 = MD5Util.md5Hex(file.getBytes())

//判断此次上传是“分片上传”还是“完整上传”
if(uploadService.exist(md5))
    return JsonResult.ok()

//将上传的文件写入本地磁盘
File file = new File(FILE_PATH, md5)
fileOutPutStream.write(file.getBytes())

在以上代码中,我们在前端进行大文件上传时,使用FormData对象附带上传的文件和文件的MD5值。在后端接收到文件时,对文件进行MD5处理,判断文件是否存在,如果不存在,则将文件保存到本地磁盘中。

示例2:分片上传

以下是使用Spring Boot实现分片上传的示例代码:

//前端代码,将文件分片后,发送Ajax请求
let uploadFileChunk = axios.create()
let currentChunk = 0
const chunkSize = 1024 * 1024  //1MB

uploadFileChunk.post(url, { 
    chunk: fileChunk,
    filename: file.name,
    total: chunks,
    index: currentChunk,
    md5: md5
})

//后端代码,将分片按照顺序保存到本地
File file = new File(FILE_PATH, md5 + '_'+ index)
fileOutputStream.write(chunk.getBytes())

在以上代码中,我们使用axios发送Ajax请求,将分片上传到后端。后端接收到分片后,根据上传的顺序,将分片保存到本地磁盘中。

 

参考文章:http://blog.ncmem.com/wordpress/2023/11/16/springboot%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e3%80%81%e5%88%86%e7%89%87%e4%b8%8a%e4%bc%a0%e3%80%81%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%e3%80%81%e7%a7%92%e4%bc%a0%e7%9a%84%e5%ae%9e-3/

欢迎入群一起讨论

 

 

标签:断点续传,springboot,文件,分片,MD5,上传,md5
From: https://www.cnblogs.com/songsu/p/17835545.html

相关文章

  • 十三:文件操作类&编辑器&上传下载删除读写
    文件获取操作:1functiongetfilename()2{3$dir=getcwd();4$file=scandir($dir);5foreach($fileas$value)6{7if($value!='.'&&$value!='..')8{9$arr[]=$value;1......
  • vue中el-upload结合vuedraggable实现图片的上传、排序、删除以及预览等功能_element u
    <template><div><ulclass="el-upload-listel-upload-list--picture-card"style="display:flex;"><div><!--start:拖拽开始end:拖拽结束imageLists:需要展示图片的数组-->......
  • SpringBoot
    一、简介SpringBoot是Spring公司的一个顶级项目,和SpringFramework是一个级别的。不需要编写xml配置文件,通过利用pringFramework4自动配置特性完成配置。启动器就是引入相关的依赖,通过java配置的方式完成自动配置。1.特征使用SpringBoot可以创建独立的Spring应......
  • day130-springboot的各种配置与应用
    编写springboot应用看官方文档DevelopingwithSpringBoot查看场景依赖,引入对应自动配置的场景,编写配置文件中debug=true开启自动配置报告。Negative(不生效)Positive(生效)Lombok的应用Lombok用标签方式代替构造器、getter/setter、toString()等鸡肋代码。引入依赖......
  • 文件上传
    前端<divclass="container"><formaction=""method="post"enctype="multipart/form-data">{%csrf_token%}<inputtype="text"name="username"><inp......
  • vue 实现文件切片上传
    在实际开发项目过程中有时候需要上传比较大的文件,然后呢,上传的时候相对来说就会慢一些,so,后台可能会要求前端进行文件切片上传,很简单哈,就是把比如说1个G的文件流切割成若干个小的文件流,然后分别请求接口传递这个小的文件流。流程简说实现文件切片导入,首先我们使用elementUI也好,......
  • SpringBoot模拟插入1000000万条数据
    一、数据库表准备CREATETABLE`student`(`id`bigintNOTNULLCOMMENT'用户id',`name`varchar(50)COLLATEutf8mb4_general_ciDEFAULTNULLCOMMENT'姓名',`address`varchar(250)COLLATEutf8mb4_general_ciDEFAULTNULLCOMMENT'地址'......
  • vue-大文件分片及断点上传
    最近开发过程中,有一个大文件分片上传的功能,借鉴于网上的思路,结合自己后端的逻辑,完成了这个功能,在此记录如下:界面展示:    一、将大文件分片上传写为一个组件,可以全局注册该组件,也可以在使用的页面注册该组件,使用vuex通讯进行组件间传值由于我有好几个页面需要使用大文......
  • springboot~ConfigurableListableBeanFactory和ApplicationContext的使用场景
    在工具类中封装getBean,使用哪个接口来实现实事上,在工具类中,实现BeanFactoryPostProcessor和ApplicationContextAware接口后,使用它们构造方法里的对象ConfigurableListableBeanFactory和ApplicationContext都可以很方便的获取spring容器里的bean,而在实际应用时,还有有些不同的,比如在......
  • SpringBoot 配置文件内容加密
    1.引入pom<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version>......