1、添加minio依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
</dependency>
2、添加配置文件

3、配置文件导入
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
public class MinIoConfig {
/**
* minIoUrl
*/
@Value("${config.minIo.url}")
private String minIoUrl;
/**
* minIoAccessKey
*/
@Value("${config.minIo.accessKey}")
private String minIoAccessKey;
/**
* minIoSecretKey
*/
@Value("${config.minIo.secretKey}")
private String minIoSecretKey;
/**
* minIoBucketName
*/
@Value("${config.minIo.minIoBucketName}")
private String minIoBucketName;
}
4、创建实例工厂
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public final class MinIoFactory {
private static MinIoConfig minIoConfig;
static {
MinIoFactory.minIoConfig = (MinIoConfig) SpringContextUtils.getBean("minIoConfig");
}
private static final ConcurrentHashMap<String, MinioClient> MINIO_CLIENT = new ConcurrentHashMap<>();
/**
* 获取minIoClient实例
*
* @return MinioClient
*/
public static MinioClient getMinIoClient() {
MinioClient minioClient = MINIO_CLIENT.get(minIoConfig.getMinIoBucketName());
if (Objects.isNull(minioClient)) {
try {
log.info("MinIo实例开始初始化");
minioClient = MinioClient.builder().endpoint(minIoConfig.getMinIoUrl())
.credentials(minIoConfig.getMinIoAccessKey(), minIoConfig.getMinIoSecretKey()).build();
final boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minIoConfig.getMinIoBucketName()).build());
if (!isExist) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(minIoConfig.getMinIoBucketName()).build());
}
MINIO_CLIENT.put(minIoConfig.getMinIoBucketName(), minioClient);
log.info("MinIo实例初始化成功");
} catch (Exception e) {
e.printStackTrace();
log.error("MinIo实例初始化失败: {}", e.fillInStackTrace());
}
}
return minioClient;
}
/**
* 获取桶名称
*
* @return String
*/
public static String getBucketName() {
return minIoConfig.getMinIoBucketName();
}
}
5、 创建工具类
import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.http.Method;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
@Slf4j
public class MinIoUtil {
/**
* 声音文件默认保存五年
*/
private static final int DEFAULT_EXPIRY_TIME = 5 * 365 * 24 * 3600;
/**
* 上传文件
*
* @param file 上传文件
* @return String
*/
@SneakyThrows(Exception.class)
public static String upload(MultipartFile file) {
final MinioClient minIoClient = MinIoFactory.getMinIoClient();
final String bucketName = MinIoFactory.getBucketName();
final InputStream inputStream = file.getInputStream();
final String fileName = file.getOriginalFilename();
minIoClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
inputStream, file.getSize(), -1)
.contentType(file.getContentType())
.build());
inputStream.close();
return getFileUrl(bucketName, fileName, minIoClient);
}
/**
* 获取minio文件的下载地址
*
* @param bucketName: 桶名
* @param fileName: 文件名
* @param minioClient minio实例对象
* @return: String
*/
@SneakyThrows(Exception.class)
public static String getFileUrl(String bucketName, String fileName, MinioClient minioClient) {
return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(Method.DELETE)
.bucket(bucketName)
.object(fileName)
.expiry(DEFAULT_EXPIRY_TIME)
.build());
}
}
6、由于minio文件默认有效期为7天
为了让路由地址长期有效,可以将桶的下载策略设置为public
mc policy set public minio/mybucket
本文介绍如何通过配置和代码实现MinIO对象存储服务的集成,包括添加依赖、配置属性、创建客户端实例及上传文件等操作。
1592

被折叠的 条评论
为什么被折叠?



