Minio是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目。基于Apache License v2.0开源协议的对象存储项目,采用Golang实现,客户端支Java,Python,Javacript, Golang语言。
其设计的主要目标是作为私有云对象存储的标准方案。主要用于存储海量的图片,视频,文档等。非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
minio的服务部署这里就不叙述了。
1.pom.xml中引用minio的依赖
io.minio
minio
8.5.3
2.application.yml配置文件中配置minio的信息
minio:
accessKey: ********
secretKey: **********
bucketName: yanliang
endPoint: http://127.0.0.1:9000 #换成自己的minio服务器地址
url: http://127.0.0.1:9000
#文件的过期时间(分钟)
expires: 5
3.写一个minio的工具类UploadMinioUtil
package com.yunmao.yanliang.util;
import io.minio.MinioClient;
import io.minio.ObjectStat;
import io.minio.Result;
import io.minio.errors.MinioException;
import io.minio.messages.Item;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.net.URL;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
/**
* minio工具类
* @author 言凉
*/
@Component
public class UploadMinioUtil {
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Value("${minio.bucketName}")
private String bucketName;
@Value("${minio.endPoint}")
private String endPoint;
@Value("${minio.url}")
private String url;
@Value("${minio.expires}")
private int expires;
/**
* 上传文件至Minio文件系统
*
* @param objectName 存在Minio系统中的路径
* @param filePath 上传文件的路径
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws InvalidKeyException
* @throws XmlPullParserException
*/
public String uploadFileMinio(String objectName, String filePath) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
String fileUrl = "";
try {
// 使用Minio服务的URL,端口,Access key和Secret key创建一个MinioClient对象
MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey);
// 检查存储桶是否已经存在
boolean isExist = minioClient.bucketExists(bucketName);
if (isExist) {
System.out.println("Bucket already exists.");
} else {
// 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。
minioClient.makeBucket(bucketName);
}
// 使用putObject上传一个文件到存储桶中。
minioClient.putObject(bucketName, objectName, filePath);
// 返回对象名
fileUrl = objectName;
} catch (MinioException e) {
e.printStackTrace();
}
return fileUrl;
}
/**
* 查询Minio文件系统中文件的url
*
* @param objectName 文件路径
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws InvalidKeyException
* @throws XmlPullParserException
* @throws MinioException
*/
public String getFileMinio(String objectName) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
String newFileUrl = "";
try {
// 使用Minio服务的URL,端口,Access key和Secret key创建一个MinioClient对象
MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey);
// 使用putObject上传一个文件到存储桶中。
String fileUrl = minioClient.presignedGetObject(bucketName, objectName, 60 * expires);
URL u = new URL(fileUrl);
String file = u.getFile();
newFileUrl = url + file;
} catch (MinioException e) {
e.printStackTrace();
}
return newFileUrl;
}
/**
* 查询Minio文件系统中文件是否存在
*
* @param objectName
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws InvalidKeyException
* @throws XmlPullParserException
* @throws MinioException
*/
public Boolean statFileMinio(String objectName) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
Boolean isExist = false;
try {
// 使用Minio服务的URL,端口,Access key和Secret key创建一个MinioClient对象
MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey);
// 获得对象的元数据。
ObjectStat objectStat = minioClient.statObject(bucketName, objectName);
isExist = true;
} catch (MinioException e) {
e.printStackTrace();
isExist = false;
}
return isExist;
}
/**
* 删除Minio文件系统中的文件
*
* @param objectName 文件路径
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws InvalidKeyException
* @throws XmlPullParserException
* @throws MinioException
*/
public void deleteFileMinio(String objectName) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
try {
// 使用Minio服务的URL,端口,Access key和Secret key创建一个MinioClient对象
MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey);
// 从mybucket中删除myobject。
minioClient.removeObject(bucketName, objectName);
} catch (MinioException e) {
e.printStackTrace();
}
}
/**
* 批量获取minio文件夹下的所有文件
*
* @param objectName 文件路径
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws InvalidKeyException
* @throws XmlPullParserException
* @throws MinioException
*/
public List getFileListMinio(String objectName) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
Iterable> files = null;
List list = new ArrayList<>();
try {
// 使用Minio服务的URL,端口,Access key和Secret key创建一个MinioClient对象
MinioClient minioClient = new MinioClient(endPoint, accessKey, secretKey);
// 使用putObject上传一个文件到存储桶中。
files = minioClient.listObjects(bucketName,objectName);
for(Result- result: files){
String objName=result.get().objectName();
String fileurl = this.getFileMinio(objName);
list.add(fileurl);
}
} catch (MinioException e) {
e.printStackTrace();
}
return list;
}
}
4.实现,在需要对接minio的地方先注入minio工具类
@Autowired
private UploadMinioUtil uploadMinioUtil;
实现用uploadMinioUtil.方法实现文件的上传,下载,删除,批量获取等操作
说明:方法中的objectName值为文件在minio系统中的路径