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

相关推荐
折哥的程序人生 · 物流技术专研7 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
GoGeekBaird7 小时前
从 Prompt Engineering 到 Loop Engineering,我觉得 AI 开发这事儿终于开始变味了
后端·github
一条泥憨鱼7 小时前
【Redis】数据类型和常用命令
java·数据库·redis·后端·缓存
云烟成雨TD7 小时前
Spring AI Alibaba 1.x 系列【78】沙箱(Sandbox)
java·人工智能·spring
程序员二叉7 小时前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试
周航宇JoeZhou8 小时前
JB3-9-SpringAI(二)
java·ai·agent·多智能体·调度·智能体·观察
好家伙VCC8 小时前
Web Components主题热切换方案揭秘
java·前端
慕木沐8 小时前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
Oneslide8 小时前
初始化微信小程序
后端
hboot8 小时前
AI工程师第一课 - Python
前端·后端·python