springBoot集成minio,实现分片、断点续传

文章介绍了在处理大文件,特别是1G以上视频上传时,如何利用Minio实现分片上传和断点续传功能,以解决上传中断和空间浪费的问题。前端首先计算视频MD5,然后通过后端接口获取分片上传地址,直接与Minio交互上传分片。若上传中断,可以根据MD5查询已上传的分片,继续未完成的上传,最后合并所有分片。

前言

近期的项目中涉及到1G以上的视频上传,除了考虑上传效率之外,还要考虑到用户在上传过程中出现断网,浏览器意外关闭等情况。下面是我调研的两种处理方式:

一、传统的处理方案是在本地新建临时文件夹,储存视频分片,等全部上传完成后进行合并,然后删除临时文件夹,这样做会存在问题:比如多个用户都上传了一半视频不想上传了,没有进行合并,那么将会大致大量的临时文件夹保存在服务器,造成空间浪费。这里还需要自己想办法手动清理临时文件中保存的视频分片。

二、通过Minio实现分片及断点续传,该方案可以解决上述传统方案中所产生的问题,minio自己会去处理没有上传完的分片。下面记录一下我的使用过程。

Minio集成

思路:

1、前端根据视频文件计算MD5,MD5用来做断点续传,如果不需要断点续传可以不计算MD5。

2、前端掉用后端接口获取切片临时上传地址,获取地址后,前端直连Minio将切片视频进行上传

3、如果出现上传中断,再次选择该文件上传时,后端根据MD5去数据库查取数据,并调用minio的listParts方法获取已上传的切片,后端处理数据后,响应给前端未上传的切片上传地址,前端拿到后将未上传的切分进行上传。

4、前端在所有切片上传完成后,调用后端的completeMultipartUpload方法合并所有切片。

代码:

依赖引入

<dependency>
     <groupId>io.minio</groupId>
     <artifactId>minio</artifactId>
     <ve
### Spring Boot 集成 MinIO 实现断点续传 为了在Spring Boot项目中集成MinIO实现断点续传功能,需遵循特定配置与编码实践。具体而言,在`application.yml`文件内调整最大上传文件尺寸设置为支持较大文件的分片上传[^1]。 #### 修改Spring Boot 文件上传限制 ```yaml spring: servlet: multipart: max-file-size: 50MB max-request-size: 50MB ``` 上述配置允许单次请求携带的最大数据量达到50MB,满足大文件分片传输的需求。 #### 编写控制器逻辑处理文件上传 创建用于接收前端发送过来的大文件片段的服务端接口,并确保这些片段能被正确地保存到MinIO对象存储服务里: ```java @RestController @RequestMapping("/api/file") public class FileUploadController { @Autowired private MinioClient minioClient; public static final int CHUNK_SIZE = 5 * 1024 * 1024; // 定义每一片段大小为5M字节 /** * 处理文件上传请求的方法 */ @PostMapping(value="/upload", consumes="multipart/form-data") public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("fileName") String fileName, @RequestParam("chunkIndex") Integer chunkIndex, @RequestParam("totalChunks") Integer totalChunks){ try { InputStream inputStream = file.getInputStream(); PutObjectArgs putObjectArgs = PutObjectArgs.builder() .bucket("my-bucket-name") .object(fileName + "-" + chunkIndex) .stream(inputStream, file.getSize(), -1) .contentType(file.getContentType()) .build(); minioClient.putObject(putObjectArgs); if(chunkIndex.equals(totalChunks)){ mergeFilesIntoOne(fileName); } return new ResponseEntity<>("Chunk uploaded successfully.", HttpStatus.OK); } catch (Exception e) { e.printStackTrace(); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } } private void mergeFilesIntoOne(String originalFileName){ // 合并所有已上传的小文件成为完整的原始文件... } } ``` 此代码段展示了如何基于接收到的信息调用MinIO客户端API完成各部分文件的实际存储操作;当最后一个碎片到达时,则触发合并过程形成最终版目标文档[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值