Springboot Minio最新版大文件上传

超详细的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值