摘要:
MinIO 是一种高性能、S3 兼容的对象存储。它是为 大规模 AI/ML、数据湖和... MinIO 是一种高性能、S3 兼容的对象存储。它是为 大规模 AI/ML、数据湖和数据库工作负载。它是软件定义的 并在任何云或本地基础设施上运行。 MinIO 具有双重许可 根据开源 GNU AGPL v3 和商业企业许可证
一、下载MinIO依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
二、MinIO工具类
package com.sl.util;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Item;
import lombok.SneakyThrows;
import org.apache.http.client.utils.URIBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
/**
* minio操作类
*/
@Component
public class MinioUtils {
@Value("${minio.buccketName}")
private String buccketName;
@Autowired
private MinioClient client;
/**
* 创建桶
*
* @param bucketName 桶名称
*/
@SneakyThrows
public void createBucket(String bucketName) {
boolean found =
client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!found) {
client.makeBucket(
MakeBucketArgs.builder()
.bucket(bucketName)
.region("cn-beijing")
.build());
}
}
/**
* 删除桶
*
* @param bucketName 桶名称
*/
@SneakyThrows
public void removeBucket(String bucketName) {
client.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
}
/**
* 获取文件信息
*
* @param bucketName 桶名称
* @param objectName 文件名称
* @return
*/
@SneakyThrows
public ObjectStat getObjectInfo(String bucketName, String objectName) {
return client.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
}
/**
* 上传文件
*
* @param bucketName 桶名称
* @param objectName 文件名
* @param stream 流
* @param fileSize 文件大小
* @param type 文件类型
* @throws Exception
*/
public void putObject(String bucketName, String objectName, InputStream stream, Long fileSize, String type) throws Exception {
client.putObject(
PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(
stream, fileSize, -1)
.contentType(type)
.build());
}
/**
* 判断文件夹是否存在
*
* @param bucketName 桶名称
* @param prefix 文件夹名字
* @return
*/
@SneakyThrows
public Boolean folderExists(String bucketName, String prefix) {
Iterable<Result<Item>> results = client.listObjects(ListObjectsArgs.builder().bucket(bucketName)
.prefix(prefix).recursive(false).build());
for (Result<Item> result:results){
Item item = result.get();
if (item.isDir()){
return true;
}
}
return false;
}
/**
* 创建文件夹
* @param bucketName 桶名称
* @param path 路径
*/
@SneakyThrows
public void createFolder(String bucketName,String path) {
client.putObject(PutObjectArgs.builder().bucket(bucketName).object(path)
.stream(new ByteArrayInputStream(new byte[]{}),0,-1).build());
}
/**
* 获取文件在minio在服务器上的外链
* @param bucketName 桶名称
* @param objectName 文件名
* @return
*/
@SneakyThrows
public String getObjectUrl(String bucketName,String objectName){
return client.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(objectName)
.build());
}
/**
* 获取minio永不失效的外链
* @param fileName 文件名称
* @param bucketName 桶名称
* @return 外链接
*/
public String getPreviewUrl(String fileName, String bucketName) {
if (StringUtils.isNotBlank(fileName)) {
String bucket = bucketName == null ? this.buccketName : bucketName;
try {
client.statObject(StatObjectArgs.builder().bucket(bucket).object(fileName).build());
String url = client.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucket)
.object(fileName)
.build());
URIBuilder uriBuilder = new URIBuilder(url);
uriBuilder.removeQuery();
return uriBuilder.build().toString();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
* 获取minio永久外链
* @param fileName 文件名称
* @param bucketName 桶名称
* @return 外链接
*/
public String getPermanentUrl(String fileName, String bucketName) {
if (StringUtils.isNotBlank(fileName)) {
String bucket = bucketName == null ? this.buccketName : bucketName;
try {
// 检查对象是否存在
client.statObject(StatObjectArgs.builder().bucket(bucket).object(fileName).build());
// 返回永久链接
return client.getObjectUrl(bucket, fileName);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
* 根据key删除服务器上的文件
*/
public boolean deleteFileByUrl(String bucketName,String fileName,String folder) {
try {
client.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(folder + fileName).build());
System.out.println(("删除" + bucketName + "下的文件" + folder + fileName + "成功"));
return true;
} catch (Exception e) {
System.out.println(("删除文件失败:{}"+ e.getMessage()));
e.printStackTrace();
return false;
}
}
}


