8、SpringBoot集成MinIO
8、SpringBoot集成MinIO
https://xiaoxueblog.com/ai/SpringBoot%E9%9B%86%E6%88%90MinIO.html
1、pom
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.12</version>
</dependency>
2、application.yml
# ========================minio=====================
minio:endpoint: http://127.0.0.1:9000accessKey: secretKey: bucketName: xxaicloud
3、MinioConfig
package com.xx.config;import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Author: xueqimiao* @Date: 2025/3/5 15:53*/
@Configuration
public class MinioConfig {@Value("${minio.endpoint:}")private String endpoint;@Value("${minio.access-key:}")private String accessKey;@Value("${minio.secret-key:}")private String secretKey;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}}
4、MinIoUtil
package com.xx.util;import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;/*** @Author: xueqimiao* @Date: 2025/3/5 15:56*/
@Component
public class MinIoUtil {@Resourceprivate MinioClient minioClient;@Value("${minio.bucketName}")private String bucketName;@Value("${minio.endpoint}")private String minIOUrl;/*** 上传文件** @param fileName* @param inputStream* @param contentType* @return*/public String upload(String fileName, InputStream inputStream, String contentType)throws ServerException, InsufficientDataException, ErrorResponseException,IOException, NoSuchAlgorithmException, InvalidKeyException,InvalidResponseException, XmlParserException, InternalException {boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if (!isExist) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}// 文件上传minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(inputStream, -1, 10485760).contentType(contentType).build());// 设置 URL 过期时间为 1 小时(3600秒)// int expirationTimeInSeconds = 3600; // 过期时间1小时// 返回 URL 地址 V1return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(fileName)//.expiry(expirationTimeInSeconds).method(Method.GET).build());}
}
5、测试
package com.xx;import com.xx.util.MinIoUtil;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;/*** @Author: xueqimiao* @Date: 2025/3/5 15:58*/
@SpringBootTest
public class MinIoUtilTest {@Resourceprivate MinIoUtil minIoUtil;@Testpublic void upload() {try {InputStream inputStream = new FileInputStream(new File("/Users/xueqimiao/Desktop/pic/1.jpg"));System.out.println(minIoUtil.upload("1.jpg", inputStream, "image/jpg"));} catch (Exception e) {throw new RuntimeException(e);}}}