超详细的SpringBoot Minio大文件上传业务,看了这个视频,你绝对不会后悔
完整代码地址:GitHub - dufGIT/minio-file: 资源文件中心
本章节主要讲Minio的文件上传以及大文件上传的功能,小文件上传比较简单,大文件上传需要前端计算整个文件的md5,然后协商下一个分片多少兆,之后就按那个去分,分完调用上传接口,上传以后合并分片文件就好了,稍微复杂了一丢丢,但是呢我会用大白话讲出来让您觉得简单的。
pom包,咱们这个是最新版,
<!-- 操作minio的java客户端-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.7</version>
</dependency>
可能会报okhttp的错,Unsupported OkHttp library found. Must use okhttp >= 4.8.1
此时需要排除minio本身的okhttp,再下载个别的版本okhttp包就可以了,代码如下:
<!-- 操作minio的java客户端-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.7</version>
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
application配置文件
redis:
host: localhost
port: 6379
database: 0
password:
spring:
datasource:
url: jdbc:mysql://localhost:3306/fileresource
password: 123456
username: root
driver-class-name: com.mysql.jdbc.Driver
#minio配置
minio:
access-key: 3qUk0XPgTKLxx8RR
secret-key: joUG6ShKxJNZtjqdzrnpO373czSfIiRP
url: http://localhost:9008 #访问地址
bucket-name: formal-file
bucket-name-slice: slice-file
minio的配置类:
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
private String accessKey;
private String secretKey;
private String url;
private String bucketName;
private String bucketNameSlice;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(url)
.credentials(accessKey, secretKey)
.build();
}
}
文件上传也包含大文件上传(进行分片)还有完整文件上传(小文件),我就都在一个接口里写都过参数来判断处理不同的逻辑,如果是分片上传的化因为接口需要调用多次,某些功能的性能或者是多次调库的原因,所以需要提取出来一两个接口进行初始化,以及检查文件是否上传多次的判断。
Controller如下:
包含文件上传以及检查文件是否上传以及文件初始化接口。还有相应的参数校验。
@Validated
@RestController
public class FileUploadController {
@Resource
private IFileUploadProcess fileUploadProcess;
@Resource
private TResourceService resourceFileService;
/**
* 文件上传
*/
@PostMapping("/upload/file")
public Result uploadFile(@Valid @ModelAttribute UploadFileReq uploadFileReq) {
return fileUploadProcess.uploadFile(uploadFileReq);
}
/**
* 检查是否上传过文件
*
* @return true:已上传过,false:没有上传过
*/
@GetMapping("/isExist/file")
public Result checkIsUploadFile(@NotBlank(message = "文件md5不能为空!")
String md5) {
try {
Boolean isExistFile = resourceFileService.checkIsExistFile(md5);
return Result.success(isExistFile);
} catch (Exception e) {
return Result.failed();
}
}
/**
* 文件初始化
* 1.创建桶
* 2.将分片索引放入到redis中
* 3.将分片以及对应基本信息先存储到资源附件中(resourceFile)
*/
@PostMapping("/init/fileData")
public Result initFileData(@RequestBody @Valid InitSliceDataReq initSliceDataReq) {
return fileUploadProcess.initFileData(initSliceDataReq);
}
}
对应需要的两个service接口,IFileUploadProcess和TResourceService
IFileUploadProcess:关于文件上传的流程接口,包括文件上传方法定义、文件初始化方法定义
public interface IFileUploadProcess {
/**
* 文件上传
* 1.完整文件直接上传,上传完更新库的文件信息(resourceFile)
* 2.分片上传需要判断是否全部都上传完,全部上传完则合并数据,
* 合并后删除原来的分片数据,并更新库的文件信息(resourceFile)。
*
* @initSliceDataReq 初始化分片需要的参数
*/
Result uploadFile(UploadFileReq uploadFileReq);
/**
* 初始化切片操作
* 1.没有桶创建桶
* 2.如果是分片缓存,后续分片上传需要
* 3.先插入一条资源附件表
*
* @initSliceDataReq 初始化分片需要的参数
*/
Result initFileData(InitSliceDataReq initSliceDataReq);
}
TResourceService:资源服务接口,主要处理文件资源落库处理,包括插入文件、检查文件是否存在库表、文件上传完毕则更新数据库为已上传。
public interface TResourceService {
/**
* 新增ResourceFile数据
*
* @param resourceFile 实例对象
* @return 实例对象
*/
Boolean insertFile(TResourceFile resourceFile);
Boolean checkIsExistFile(St