Springboot整合Minio,2024版教程

Springboot整合Minio,2024版教程

介绍

CSDN里面找资料真的是垃圾堆里刨食吃。优质作者和内容非常少,最近还出现了评论下方打广告的,粉丝上w,文章内容质量主打一个抄袭,乱写。真的难评价。

我为什么写这个?是因为我看了下搜到文章,内容掐头去尾,主打一个说了好像又没说。

安装方式

最新Minioan安装

代码

直接copy可使用。也可联系我Q:1101165230

pom

xml 复制代码
	<dependency>
		<groupId>io.minio</groupId>
		<artifactId>minio</artifactId>
		<version>8.4.6</version>
	</dependency>

yml

yml 复制代码
minio:
  endpoint: http://192.168.20.18:9000 #访问地址
  username: guoshun #用户名
  password: guoshun123... #密码
  bucket: project.apply  #存储文件夹名称

config

java 复制代码
import io.minio.MinioClient;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @version 1.0.0
 * @description minioConfig
 * @date 2024/4/4 10:44
 * @created by Guoshun
 */
@Log4j2
@Configuration
public class MinioConfig {

    @Value("${minio.endpoint}")
    private String endPoint;

    @Value("${minio.username}")
    private String username;

    @Value("${minio.password}")
    private String password;

    @Bean
    public MinioClient minioClient() {
        MinioClient minioClient = MinioClient.builder()
            .endpoint(endPoint)
            .credentials(username, password)
            .build();
        log.info("minioClient initialized.");
        return minioClient;
    }

}

MinioService

java 复制代码
	
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.concurrent.TimeUnit;

/**
 * @version 1.0.0
 * @description minio启动时创建bucket
 * @date 2024/4/4 14:00
 * @created by Guoshun
 */
@Slf4j
@Component
public class MinioService {

    @Resource
    private MinioClient minioClient;

    @Value("${minio.bucket}")
    private String bucketName;

    /**
     * 创建bucket
     * @return Boolean true成功 false 失败
     */
    @PostConstruct
    public Boolean createBucket(){
        BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder()
            .bucket(bucketName).build();
        try {
            boolean existsFlag = minioClient.bucketExists(bucketExistsArgs);
            if(!existsFlag){
                MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build();
                minioClient.makeBucket(makeBucketArgs);
            }
        }catch (Exception e){
            e.printStackTrace();
            log.error("Minio的bucket初始化失败{}", bucketName);
            return false;
        }
        return true;
    }

    /**
     * 文件上传
     * @param inputStream
     * @param contentType
     * @param fileName
     * @return
     */
    public Boolean put(InputStream inputStream, String contentType, String fileName) throws IOException {
        try {
            PutObjectArgs stream = PutObjectArgs.builder()
                .object(fileName)
                .bucket(bucketName)
                .contentType(contentType)
                .stream(inputStream, inputStream.available(), -1).build();
            minioClient.putObject(stream);
            return true;
        }catch (Exception e){
            log.error("文件上传失败,文件{}", fileName);
            throw new RuntimeException(e.getMessage());
        }finally {
            if(inputStream != null){
                inputStream.close();
            }
        }
    }

    /**
     * 获取文件的url地址
     * 支持版本管理后续增加
     *
     * @param fileName
     */
    public String getDownloadUrl(String fileName) {
        GetPresignedObjectUrlArgs presignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder()
            .bucket(bucketName).object(fileName).method(Method.GET).expiry(1, TimeUnit.HOURS).build();
        try {
            String downloadUrl = minioClient.getPresignedObjectUrl(presignedObjectUrlArgs);
            return downloadUrl;
        } catch (ServerException |
            InsufficientDataException | ErrorResponseException |
            IOException | NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException | XmlParserException | InternalException e) {
            log.error("文件下载失败{}", fileName);
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * 获取文件流
     * 后续支持写入抬头
     *
     * @param fileName
     */
    public ByteArrayOutputStream getDownloadFile(String fileName) throws IOException {
        GetObjectArgs getObjectArgs = GetObjectArgs.builder().object(fileName).bucket(bucketName).build();
        byte[] buf = new byte[1024];
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024);
        try {
            GetObjectResponse downloadUrl = minioClient.getObject(getObjectArgs);
            int length = 0;
            while ((length = downloadUrl.read(buf)) > 0) {
                outputStream.write(buf, 0, length);
            }
            return outputStream;
        } catch (ServerException |
            InsufficientDataException | ErrorResponseException |
            IOException | NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException | XmlParserException | InternalException e) {
            log.error("文件下载失败{}", fileName);
            throw new RuntimeException(e.getMessage());
        } finally {
            outputStream.close();
        }
    }

    /**
     * 文件删除
     *
     * @param key
     */
    public boolean deleteFile(String key) {
        RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucketName).object(key).build();
        try {
            minioClient.removeObject(removeObjectArgs);
        } catch (ServerException |
            InsufficientDataException | ErrorResponseException |
            IOException | NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException | XmlParserException | InternalException e){
            log.error("文件删除失败{}", key);
            throw new RuntimeException(e.getMessage());
        }
        return true;
    }

}

推荐文章

SpringBoot集成MinIO8.0

相关推荐
哎呦没1 分钟前
SpringBoot框架下的资产管理自动化
java·spring boot·后端
2401_857600954 分钟前
SpringBoot框架的企业资产管理自动化
spring boot·后端·自动化
m0_571957582 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2344 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
种树人202408194 小时前
如何在 Spring Boot 中启用定时任务
spring boot
Chrikk6 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*6 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue6 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang