1、Minio简介
Minio是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目。可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。
2、Minio 依赖Jar包
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.3.70</version>
</dependency>3、Minio 封装核心功能代码
3.1、实体对象
package com.zzg.minio;
/**
*
* @ClassName: MinioUpload
* @Description: Minio 文件式服务器工具类
* @author: zzg
* @date: 2021年4月9日 上午11:35:02
*
*/
public class MinioUploadEntity {
private String url = "";
private String access = "";
private String secret = "";
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getAccess() {
return access;
}
public void setAccess(String access) {
this.access = access;
}
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public MinioUploadEntity(String url, String access, String secret) {
super();
this.url = url;
this.access = access;
this.secret = secret;
}
}
3.2、桶策略
package com.zzg.minio.policy;
import io.minio.MinioClient;
public interface BucketPolicyInterface {
/**
*
* @Title: createBucketPolicy
* @Description: 设置桶策略
* @param: @param client
* @param: @param bucket
* @param: @return
* @return: boolean
* @throws
*/
boolean createBucketPolicy(MinioClient client, String bucket);
}
package com.zzg.minio.policy;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.minio.MinioClient;
import io.minio.SetBucketPolicyArgs;
import io.minio.errors.ErrorResponseException;
import io.minio.errors.InsufficientDataException;
import io.minio.errors.InternalException;
import io.minio.errors.InvalidResponseException;
import io.minio.errors.ServerException;
import io.minio.errors.XmlParserException;
public class BuckerReadPolicy implements BucketPolicyInterface {
// 日志记录
public static final Logger logger = LoggerFactory.getLogger(BuckerReadPolicy.class);
/**
* 桶占位符
*/
private static final String BUCKET_PARAM = "${bucket}";
/**
* bucket权限-只读
*/
private static final String READ_ONLY = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetObject\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "/*\"]}]}";
@Override
public boolean createBucketPolicy(MinioClient client, String bucket) {
// TODO Auto-generated method stub
try {
client.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).config(READ_ONLY.replace(BUCKET_PARAM, bucket)).build());
return true;
} catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException
| InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException
| IllegalArgumentException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
}
return false;
}
}
package com.zzg.minio.policy;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.minio.MinioClient;
import io.minio.SetBucketPolicyArgs;
import io.minio.errors.ErrorResponseException;
import io.minio.errors.InsufficientDataException;
import io.minio.errors.InternalException;
import io.minio.errors.InvalidResponseException;
import io.minio.errors.ServerException;
import io.minio.errors.XmlParserException;
public class BuckerWritePoliy implements BucketPolicyInterface {
// 日志记录
public static final Logger logger = LoggerFactory.getLogger(BuckerWritePoliy.class);
/**
* 桶占位符
*/
private static final String BUCKET_PARAM = "${bucket}";
/**
* bucket权限-只读
*/
private static final String WRITE_ONLY = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "/*\"]}]}";
@Override
public boolean createBucketPolicy(MinioClient client, String bucket) {
// TODO Auto-generated method stub
try {
client.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).config(WRITE_ONLY.replace(BUCKET_PARAM, bucket)).build());
return true;
} catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException
| InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException
| IllegalArgumentException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
}
return false;
}
}
package com.zzg.minio.policy;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.minio.MinioClient;
import io.minio.SetBucketPolicyArgs;
import io.minio.errors.ErrorResponseException;
import io.minio.errors.InsufficientDataException;
import io.minio.errors.InternalException;
import io.minio.errors.InvalidResponseException;
import io.minio.errors.ServerException;
import io.minio.errors.XmlParserException;
public class BuckerReadWriterPolicy implements BucketPolicyInterface {
// 日志记录
public static final Logger logger = LoggerFactory.getLogger(BuckerReadWriterPolicy.class);
/**
* 桶占位符
*/
private static final String BUCKET_PARAM = "${bucket}";
/**
* bucket权限-读写
*/
private static final String READ_WRITE = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\"Resource\":[\"arn:aws:s3:::" + BUCKET_PARAM + "/*\"]}]}";
@Override
public boolean createBucketPolicy(MinioClient client, String bucket) {
// TODO Auto-generated method stub
try {
client.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).config(READ_WRITE.replace(BUCKET_PARAM, bucket)).build());
return true;
} catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException
| InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException
| IllegalArgumentException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
}
return false;
}
}
package com.zzg.minio.policy;
import io.minio.MinioClient;
public class BuckerDefaultPolicy implements BucketPolicyInterface {
@Override
public boolean createBucketPolicy(MinioClient client, String bucket) {
// TODO Auto-generated method stub
return false;
}
}
package com.zzg.minio.policy;
import java.util.HashMap;
import java.util.Map;
import com.zzg.minio.content.BuckerPolicyContent;
public class BuckerPolicyFactory {
static Map<String, BucketPolicyInterface> operationMap = new HashMap<>();
static {
operationMap.put(BuckerPolicyContent.READ, new BuckerReadPolicy());// 只读
operationMap.put(BuckerPolicyContent.WRITE, new BuckerWritePoliy());// 只写
operationMap.put(BuckerPolicyContent.READ_WRITE, new BuckerReadWriterPolicy());// 读写
}
public static BucketPolicyInterface getBucketPolicyInterface(String poliy){
BucketPolicyInterface object = operationMap.get(poliy);
if(object == null){
object = new BuckerDefaultPolicy();
}
return object;
}
}
3.3、桶常量
package com.zzg.minio.content;
public class BuckerPolicyContent {
public static final String READ ="read";
public static final String WRITE ="write";
public static final String READ_WRITE ="read-write";
}3.4、Minio 核心功能代码
package com.zzg.minio;
import java.io.InputStream;
public interface MinioUploadInteface {
/**
*
* @Title: uploadFile
* @Description: 文件上传
* @param: @param file
* @param: @param bucket
* @param: @param contentType
* @param: @param suffix
* @param: @return
* @return: String
* @throws
*/
String uploadFile(InputStream stream, String bucket, String contentType, String suffix);
/**
*
* @Title: removeFile
* @Description: 文件删除
* @param: @param objectKey
* @param: @param bucket
* @param: @return
* @return: String
* @throws
*/
boolean removeFile(String objectKey, String bucket);
/**
*
* @Title: downloadFile
* @Description: 文件下载
* @param: @param objectKey
* @param: @param bucket
* @param: @return
* @return: File
* @throws
*/
InputStream downloadFile(String objectKey, String bucket);
/**
*
* @Title: createBucket
* @Description: 创建桶,并指定桶策略
* @param: @param bucket
* @param: @param policy
* @param: @return
* @return: boolean
* @throws
*/
boolean createBucket(String bucket);
/**
*
* @Title: removeBucket
* @Description: 移除指定桶
* @param: @param bucket
* @param: @return
* @return: boolean
* @throws
*/
boolean removeBucket(String bucket);
/**
*
* @Title: setBucketPolicy
* @Description: 设置桶策略
* @param: @param bucket
* @param: @param policy
* @param: @return
* @return: boolean
* @throws
*/
boolean setBucketPolicy(String bucket, String policy);
}
package com.zzg.minio;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zzg.common.util.UUIDUtils;
import com.zzg.minio.policy.BuckerPolicyFactory;
import com.zzg.minio.policy.BucketPolicyInterface;
import io.minio.BucketExistsArgs;
import io.minio.GetObjectArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.RemoveBucketArgs;
import io.minio.RemoveObjectArgs;
import io.minio.errors.ErrorResponseException;
import io.minio.errors.InsufficientDataException;
import io.minio.errors.InternalException;
import io.minio.errors.InvalidResponseException;
import io.minio.errors.ServerException;
import io.minio.errors.XmlParserException;
public class MinioUploadUtil implements MinioUploadInteface {
// 日志记录
public static final Logger logger = LoggerFactory.getLogger(MinioUploadUtil.class);
private MinioUploadEntity entity;
public MinioUploadEntity getEntity() {
return entity;
}
public void setEntity(MinioUploadEntity entity) {
this.entity = entity;
}
public MinioUploadUtil(MinioUploadEntity entity) {
super();
this.entity = entity;
}
public MinioClient createMinioClient(){
//创建MinioClient对象
MinioClient minioClient = MinioClient.builder()
.endpoint(entity.getUrl())
.credentials(entity.getAccess(), entity.getSecret())
.build();
return minioClient;
}
@Override
public String uploadFile(InputStream stream, String bucket, String contentType, String suffix) {
// TODO Auto-generated method stub
//创建MinioClient对象
MinioClient minioClient = this.createMinioClient();
// 生成文件上传唯一名称
String objectKey =UUIDUtils.getUUID().concat(".").concat(suffix);
// 文件流上传
try {
minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectKey).stream(stream, stream.available(), -1).contentType(contentType).build());
// 返回文件上传的唯一标识
return objectKey;
} catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException
| InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException
| IllegalArgumentException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
}
return null;
}
@Override
public boolean removeFile(String objectKey, String bucket) {
// TODO Auto-generated method stub
//创建MinioClient对象
MinioClient minioClient = this.createMinioClient();
try {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectKey).build());
return true;
} catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException
| InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException
| IllegalArgumentException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
}
return false;
}
@Override
public InputStream downloadFile(String objectKey, String bucket) {
// TODO Auto-generated method stub
//创建MinioClient对象
MinioClient minioClient = this.createMinioClient();
try {
// 返回文件流
return minioClient.getObject(GetObjectArgs.builder().bucket(bucket).object(objectKey).build());
} catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException
| InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException
| IllegalArgumentException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
}
return null;
}
@Override
public boolean createBucket(String bucket) {
// TODO Auto-generated method stub
boolean target = false;
//创建MinioClient对象
MinioClient minioClient = this.createMinioClient();
// 判断桶是否存在
BucketExistsArgs exist = BucketExistsArgs.builder().bucket(bucket).build();
try {
boolean result = minioClient.bucketExists(exist);
if(!result){
MakeBucketArgs create =MakeBucketArgs.builder().bucket(bucket).build();
minioClient.makeBucket(create);
target = true;
}
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
} catch (ErrorResponseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
} catch (InsufficientDataException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
} catch (InternalException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
} catch (InvalidResponseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
} catch (ServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
} catch (XmlParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
}
return target;
}
@Override
public boolean removeBucket(String bucket) {
// TODO Auto-generated method stub
//创建MinioClient对象
MinioClient minioClient = this.createMinioClient();
// 判断桶是否存在
BucketExistsArgs exist = BucketExistsArgs.builder().bucket(bucket).build();
try {
boolean result = minioClient.bucketExists(exist);
if(result){
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());
return true;
}
} catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException
| InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException
| IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
}
return false;
}
@Override
public boolean setBucketPolicy(String bucket, String policy) {
// TODO Auto-generated method stub
//创建MinioClient对象
MinioClient minioClient = this.createMinioClient();
// 判断桶是否存在
BucketExistsArgs exist = BucketExistsArgs.builder().bucket(bucket).build();
try {
boolean result = minioClient.bucketExists(exist);
if(result){
BucketPolicyInterface bucketPolicy = BuckerPolicyFactory.getBucketPolicyInterface(policy);
return bucketPolicy.createBucketPolicy(minioClient, bucket);
}
} catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException
| InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException
| IOException e) {
// TODO Auto-generated catch block
logger.error("error: {}", e.getMessage(), e);
}
return false;
}
public static void main(String[] args) {
// MinioUploadEntity entity = new MinioUploadEntity("http://192.168.1.74:9000/", "minioadmin", "minioadmin");
// MinioUploadUtil util = new MinioUploadUtil(entity);
// boolean target = util.createBucket("zzg-img");
// if(target){
// System.out.println("桶创建成功");
// } else {
// System.out.println("桶已经存在");
// }
// MinioUploadEntity entity = new MinioUploadEntity("http://192.168.1.74:9000", "minioadmin", "minioadmin");
// MinioUploadUtil util = new MinioUploadUtil(entity);
// //boolean target = util.setBucketPolicy("zzg-img", BuckerPolicyContent.READ);
// boolean target = util.setBucketPolicy("gxpt-img", BuckerPolicyContent.READ_WRITE);
// if(target){
// System.out.println("桶策略更新成功");
// } else {
// System.out.println("桶策略更新失败");
// }
// MinioUploadEntity entity = new MinioUploadEntity("http://192.168.1.74:9000/", "minioadmin", "minioadmin");
// MinioUploadUtil util = new MinioUploadUtil(entity);
// boolean target = util.removeBucket("zzg-img");
// if(target){
// System.out.println("桶删除成功");
// } else {
// System.out.println("桶删除失败");
// }
// MinioUploadEntity entity = new MinioUploadEntity("http://192.168.1.74:9000", "minioadmin", "minioadmin");
// MinioUploadUtil util = new MinioUploadUtil(entity);
// File file = new File("C:\\logo.png");
// // 获取文件后缀类型
// String suffix = FilenameUtils.getExtension(file.getPath());
// FileInputStream stream = null;
// try {
// stream = new FileInputStream(file);
// } catch (FileNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// if(stream != null){
// String key = util.uploadFile(stream, "gxpt-img", "image/png", suffix);
// if(StringUtils.isNotBlank(key)){
// System.out.println("文件上传成功:" + key);
// } else {
// System.out.println("文件上传失败:" + key);
// }
// }
// MinioUploadEntity entity = new MinioUploadEntity("http://192.168.1.74:9000", "minioadmin", "minioadmin");
// MinioUploadUtil util = new MinioUploadUtil(entity);
// String objectKey ="3b7e34cd0df242bdb2af1846755c9058.png";
// String bucket ="gxpt-img";
// boolean target = util.removeFile(objectKey, bucket);
// if(target){
// System.out.println("指定文件删除成功");
// } else {
// System.out.println("指定文件删除失败");
// }
MinioUploadEntity entity = new MinioUploadEntity("http://192.168.1.74:9000", "minioadmin", "minioadmin");
MinioUploadUtil util = new MinioUploadUtil(entity);
String objectKey ="20200830141924415.png";
String bucket ="gxpt-img";
InputStream stream = util.downloadFile(objectKey, bucket);
// 目标文件
File targetFile = new File("D:\\20200830141924415.png");
try {
if(!targetFile.exists()){
targetFile.createNewFile();
}
FileUtils.copyInputStreamToFile(stream, targetFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error("error: {}", e.getMessage(), e);
}
}
}
版权声明:本文为zhouzhiwengang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。