minio是一款分布式存储系统,上一篇详细介绍了minio在windows环境下的搭建集群并通过nginx实现负载均衡,这里简单介绍下springboot项目整合minio并实现文件的上传下载删除等操作。
一、依赖的引入
1.1、maven项目
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.0</version>
</dependency>
1.2、普通项目
普通项目采用手动引入jar包方式会挺麻烦的,推荐使用maven来引入依赖
普通项目使用minio需要引入jar包大致包括minio-8.3.0.jar ; okio-2.5.0.jar ; okhttp-4.8.1.jar ; guava-22.0.jar
二、minio配置类
@Configuration
@Slf4j
public class MinioConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Value("${minio.bucketName}")
private String bucketName;
@Bean
public MinioClient minioClient(){
MinioClient minioClient = MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
try {
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if(!found){
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
log.info("minio初始化桶:"+bucketName);
}
} catch (Exception e) {
log.error(e.getMessage());
}
return minioClient;
}
}
其中四个变量为application.yml
中的配置,MinioConfig.java
配置文件创建了minio分布式存储系统的操作客户端minioClient并交给springboot进行管理,且创建了名为java-bucket的桶。
# 分布式存储minio相关配置
minio:
# 分布式存储的服务地址,要做集群的话则是通过nginx配置负载均衡,该地址指向nginx入口
endpoint: http://127.0.0.1:9001
# 分布式存储系统对应的用户名和密码
accessKey: minioadmin
secretKey: minioadmin
# 所有文件均存储在该名称对应的桶中
bucketName: java-bucket
三、通过minioClient操作文件
@Component
public class minioUtil{
private static MinioClient minioClient;
private static String bucketName;
// 由于静态方法中只能用静态变量,而静态变量无法直接实现注入,为此通过非静态的set方法注入值
@Value("${minio.bucketName}")
public void setBucketName(String bucketName) {
fileUtils.bucketName = bucketName;
}
@Autowired
public void setMinioClient(MinioClient minioClient) {
fileUtils.minioClient = minioClient;
}
// 将本地文件夹整个上传至minio存储系统,其中dirName表示上传的文件夹路径如 C:/admin/testDir ,len表示对源路径的截取长度,使其上传至minio存储系统保持相对路径,比如C:/admin/testDir/test.txt 截取成 admin/testDir/test.txt
public static void minio_uploadFile(String dirName,int len){
List<String> filePathList = new ArrayList<>();
File file = new File(dirName);
minio_recursionGetFileList(file,filePathList);
for (String s : filePathList) {
minio_uploadSingleFile(s.substring(len,s.length()),s);
}
}
// 递归获取parentFile文件夹下的所有文件目录
private static void minio_recursionGetFileList(File parentFile, List<String> filePathList) {
File[] files = parentFile.listFiles();
for (File file : files) {
if(file.isFile()){
filePathList.add(file.getPath());
}else {
minio_recursionGetFileList(file,filePathList);
}
}
}
// 本地单个文件的上传
public static void minio_uploadSingleFile(String objectName,String fileName){
objectName = objectName.replace("\\","/");
// 上传文件
try {
minioClient.uploadObject(UploadObjectArgs.builder()
.bucket(bucketName)
.object(objectName) // 上传到分布式系统的文件名称
.filename(fileName) // 本地文件路径
.build());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 删除minio存储系统bucketName桶中文件
// objectName为要删除的文件名,如要删除b文件夹下的test.txt,则objectName应为"b/test.txt"
private static void minio_deleteFile(String objectName){
try {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
} catch (Exception e) {
log.error("删除minio中文件出现错误:"+e.getMessage());
}
}
// minio存储系统中下载objectName的文件到fileName,如下载objectName = "b/test.txt" , fileName = "C:/test1.txt"
private static void minio_downloadFile(String objectName,String fileName){
try {
minioClient.downloadObject(DownloadObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.filename(fileName)
.build());
} catch (Exception e) {
log.info("下载minio文件出现错误:"+e.getMessage());
}
}
// 获取minio的bucketName桶的所有文件列表
private static void minio_getFileList(){
// 获取文件列表
Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());
Iterator<Result<Item>> iterator = results.iterator();
List<Object> items = new ArrayList<>();
String format = "{'fileName':'%s','fileSize':'%s'}";
try {
while (iterator.hasNext()){
Item item = iterator.next().get();
System.out.println(item.objectName());
System.out.println(item.size());
}
} catch (Exception e) {
log.error("获取minio中文件列表出错:"+e.getMessage());
}
}
/**
* @description 多文件上传至minio系统
*/
public static void uploadToMinio(List<MultipartFile> multipartFiles,String dir) {
for (int i = 0; i < multipartFiles.size(); i++) {
minio_uploadFile(multipartFiles.get(i),multipartFiles.get(i).getName(),dir);
}
}
private static void minio_uploadFile(MultipartFile file,String objectName,String dir){
try {
InputStream inputStream = file.getInputStream();
minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(dir+"/"+objectName)
.contentType(file.getContentType())
.stream(inputStream, inputStream.available(), -1)
.build());
} catch (Exception e) {
log.error("文件上传至minio出错:"+e.getMessage());
}
}
// 将minio存储系统中整个dir目录全部删除
public static void deleteDirFromMinio(String dir){
try {
Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).delimiter(dir).prefix(dir+"/").build());
for (Result<Item> itemResult : results) {
Item item = itemResult.get();
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(item.objectName()).build());
}
} catch (Exception e) {
log.error("删除minio中文件出现错误:"+e.getMessage());
}
}
}