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

相关推荐
陈平安Java and C5 小时前
MyBatisPlus
java
秋野酱5 小时前
如何在 Spring Boot 中实现自定义属性
java·数据库·spring boot
安的列斯凯奇6 小时前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试
Bunny02126 小时前
SpringMVC笔记
java·redis·笔记
架构文摘JGWZ6 小时前
FastJson很快,有什么用?
后端·学习
BinaryBardC6 小时前
Swift语言的网络编程
开发语言·后端·golang
feng_blog66886 小时前
【docker-1】快速入门docker
java·docker·eureka
邓熙榆6 小时前
Haskell语言的正则表达式
开发语言·后端·golang
枫叶落雨2228 小时前
04JavaWeb——Maven-SpringBootWeb入门
java·maven
m0_748232398 小时前
SpringMVC新版本踩坑[已解决]
java