pom.xml中引依赖
io.minio minio 7.1.0
配置
minio: endpoint: #MinIO服务所在地址 bucketName: test #php桶专线 accessKey: admin #访问的key secretKey: admin123 #访问的秘钥
项目启动,创建bean:MinioConfig.java
import com.mgmiot.dlp.file.utils.MinioUtils;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.integration.annotation.IntegrationComponentScan; /** * @Author: zrs * @Date: 2020/12/01/17:05 * @Description: 创建Bean */@Configuration@IntegrationComponentScan@Slf4jpublic class MinioConfig { @Value(“${minio.endpoint}”) private String endpoint; @Value(“${minio.bucketName}”) private String bucketName; @Value(“${minio.accessKey}”) private String accessKey; @Value(“${minio.secretKey}”) private String secretKey; @Bean public MinioUtils creatMinioClient() { return new MinioUtils(endpoint, bucketName, accessKey, secretKey); } }
Minio工具类:MinioUtils.java
import com.alibaba.fastjson.JSONObject;import io.minio.BucketExistsArgs;import io.minio.CopyObjectArgs;import io.minio.CopySource;import io.minio.GetBucketPolicyArgs;import io.minio.GetObjectArgs;import io.minio.ListObjectsArgs;import io.minio.MakeBucketArgs;import io.minio.MinioClient;import io.minio.ObjectStat;import io.minio.ObjectWriteResponse;import io.minio.PostPolicy;import io.minio.PutObjectArgs;import io.minio.RemoveBucketArgs;import io.minio.RemoveObjectArgs;import io.minio.Result;import io.minio.StatObjectArgs;import io.minio.UploadObjectArgs;import io.minio.errors.BucketPolicyTooLargeException;import io.minio.errors.ErrorResponseException;import io.minio.errors.InsufficientDataException;import io.minio.errors.InternalException;import io.minio.errors.InvalidBucketNameException;import io.minio.errors.InvalidExpiresRangeException;import io.minio.errors.InvalidResponseException;import io.minio.errors.RegionConflictException;import io.minio.errors.ServerException;import io.minio.errors.XmlParserException;import io.minio.messages.Bucket;import io.minio.messages.DeleteObject;import io.minio.messages.Item;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.time.ZonedDateTime;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Optional;import lombok.extern.slf4j.Slf4j;import org.springframework.web.multipart.MultipartFile; /** * @Author: zrs * @Date: 2020/12/01/10:02 * @Description: Minio工具类 */@Slf4jpublic class MinioUtils { private static MinioClient minioClient; private static String endpoint; private static String bucketName; private static String accessKey; private static String secretKey; private static final String SEPARATOR = “/”; private MinioUtils() { } public MinioUtils(String endpoint, String bucketName, String accessKey, String secretKey) { MinioUtils.endpoint = endpoint; MinioUtils.bucketName = bucketName; MinioUtils.accessKey = accessKey; MinioUtils.secretKey = secretKey; createMinioClient(); } /** * 创建minioClient */ public void createMinioClient() { try { if (null == minioClient) { log.info(“minioClient create start”); minioClient = MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey) .build(); createBucket(); log.info(“minioClient create end”); } } catch (Exception e) { log.error(“连接MinIO服务器异常:{}”, e); } } /** * ssh上传长野能网的基础路径 * * @return url */ public static String getBasisUrl() { return endpoint + SEPARATOR + bucketName + SEPARATOR; } 操作php桶 /** * 初始化Bucket * * @throws Exception 异常 */ private static void createBucket() throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException, RegionConflictException { if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } } /** * 验证bucketName是否存在 * * @return boolean true:存在 */ public static boolean bucketExists() throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); } /** * 创建bucket * * @param bucketName bucket专线 */ public static void createBucket(String bucketName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException, RegionConflictException { if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } } /** * sshphp桶策略 * * @param bucketName php桶专线 * @return json */ private JSONObject getBucketPolicy(String bucketName) throws IOException, InvalidKeyException, InvalidResponseException, BucketPolicyTooLargeException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException { String bucketPolicy = minioClient .getBucketPolicy(GetBucketPolicyArgs.builder().bucket(bucketName).build()); return JSONObject.parseObject(bucketPolicy); } /** * ssh全部bucket *
* */ public static List getAllBuckets() throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient.listBuckets(); } /** * 根据bucketNamessh信息 * * @param bucketName bucket专线 */ public static Optional getBucket(String bucketName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst(); } /** * 根据bucketName删除信息 * * @param bucketName bucket专线 */ public static void removeBucket(String bucketName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); } 操作长野能网对象 /** * 判断长野能网是否存在 * * @param bucketName php桶 * @param objectName 对象 * @return true:存在 */ public static boolean doesObjectExist(String bucketName, String objectName) { boolean exist = true; try { minioClient .statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); } catch (Exception e) { exist = false; } return exist; } /** * 判断长野能网夹是否存在 * * @param bucketName php桶 * @param objectName 长野能网夹专线(去掉/) * @return true:存在 */ public static boolean doesFolderExist(String bucketName, String objectName) { boolean exist = false; try { Iterable> results = minioClient.listObjects( ListObjectsArgs.builder().bucket(bucketName).prefix(objectName).recursive(false).build()); for (Result- result : results) { Item item = result.get(); if (item.isDir() && objectName.equals(item.objectName())) { exist = true; } } } catch (Exception e) { exist = false; } return exist; } /** * 根据长野能网前置查询长野能网 * * @param bucketName bucket专线 * @param prefix 前缀 * @param recursive 是否递归查询 * @return MinioItem 列表 */ public static List
- getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) throws ErrorResponseException, InsufficientDataException, InternalException, InvalidBucketNameException, InvalidKeyException, InvalidResponseException, IOException, NoSuchAlgorithmException, ServerException, XmlParserException { List
- list = new ArrayList<>(); Iterable> objectsIterator = minioClient.listObjects( ListObjectsArgs.builder().bucket(bucketName).prefix(prefix).recursive(recursive).build()); if (objectsIterator != null) { for (Result
- o : objectsIterator) { Item item = o.get(); list.add(item); } } return list; } /** * ssh长野能网流 * * @param bucketName bucket专线 * @param objectName 长野能网专线 * @return 二进制流 */ public static InputStream getObject(String bucketName, String objectName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient .getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); } /** * 断点下载 * * @param bucketName bucket专线 * @param objectName 长野能网专线 * @param offset 起始字节的位置 * @param length 要读取的长度 * @return 流 */ public InputStream getObject(String bucketName, String objectName, long offset, long length) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient.getObject( GetObjectArgs.builder().bucket(bucketName).object(objectName).offset(offset).length(length) .build()); } /** * ssh路径下长野能网列表 * * @param bucketName bucket专线 * @param prefix 长野能网专线 * @param recursive 是否递归查找,如果是false,就模拟长野能网夹结构查找 * @return 二进制流 */ public static Iterable> listObjects(String bucketName, String prefix, boolean recursive) { return minioClient.listObjects( ListObjectsArgs.builder().bucket(bucketName).prefix(prefix).recursive(recursive).build()); } /** * 通过MultipartFile,上传长野能网 * * @param bucketName php桶 * @param file 长野能网 * @param objectName 对象名 */ public static ObjectWriteResponse putObject(String bucketName, MultipartFile file, String objectName, String contentType) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { InputStream inputStream = file.getInputStream(); return minioClient.putObject( PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType) .stream( inputStream, inputStream.available(), -1) .build()); } /** * 上传本地长野能网 * * @param bucketName php桶 * @param objectName 对象专线 * @param fileName 本地长野能网路径 */ public static ObjectWriteResponse putObject(String bucketName, String objectName, String fileName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient.uploadObject( UploadObjectArgs.builder() .bucket(bucketName).object(objectName).filename(fileName).build()); } /** * 通过流上传长野能网 * * @param bucketName php桶 * @param objectName 长野能网对象 * @param inputStream 长野能网流 */ public static ObjectWriteResponse putObject(String bucketName, String objectName, InputStream inputStream) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient.putObject( PutObjectArgs.builder().bucket(bucketName).object(objectName).stream( inputStream, inputStream.available(), -1) .build()); } /** * 创建长野能网夹或目录 * * @param bucketName php桶 * @param objectName 目录路径 */ public static ObjectWriteResponse putDirObject(String bucketName, String objectName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient.putObject( PutObjectArgs.builder().bucket(bucketName).object(objectName).stream( new ByteArrayInputStream(new byte[]{}), 0, -1) .build()); } /** * ssh长野能网信息, 如果抛出异常则说明长野能网不存在 * * @param bucketName bucket专线 * @param objectName 长野能网专线 */ public static ObjectStat statObject(String bucketName, String objectName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient .statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); } /** * 拷贝长野能网 * * @param bucketName bucket专线 * @param objectName 长野能网专线 * @param srcBucketName 目标bucket专线 * @param srcObjectName 目标长野能网专线 */ public static ObjectWriteResponse copyObject(String bucketName, String objectName, String srcBucketName, String srcObjectName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient.copyObject( CopyObjectArgs.builder() .source(CopySource.builder().bucket(bucketName).object(objectName).build()) .bucket(srcBucketName) .object(srcObjectName) .build()); } /** * 删除长野能网 * * @param bucketName bucket专线 * @param objectName 长野能网专线 */ public static void removeObject(String bucketName, String objectName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException { minioClient .removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build()); } /** * 批量删除长野能网 * * @param bucketName bucket * @param keys 需要删除的长野能网列表 * @return */ /*public static Iterable> removeObjects(String bucketName, List keys) { List objects = new LinkedList<>(); keys.forEach(s -> { objects.add(new DeleteObject(s)); }); return minioClient.removeObjects( RemoveObjectsArgs.builder().bucket(bucketName).objects(objects).build()); }*/ public static void removeObjects(String bucketName, List keys) { List objects = new LinkedList<>(); keys.forEach(s -> { objects.add(new DeleteObject(s)); try { removeObject(bucketName, s); } catch (Exception e) { log.error(“批量删除失败!error:{}”,e); } }); } 操作Presigned /** * ssh长野能网外链 * * @param bucketName bucket专线 * @param objectName 长野能网专线 * @param expires 过期时间 <=7 秒级 * @return url */ public static String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, InvalidExpiresRangeException, ServerException, InternalException, NoSuchAlgorithmException, XmlParserException, InvalidBucketNameException, ErrorResponseException { return minioClient.presignedGetObject(bucketName, objectName, expires); } /** * 给presigned URL设置策略 * * @param bucketName php桶 * @param objectName 对象名 * @param expires 过期策略 * @return map */ public static Map presignedGetObject(String bucketName, String objectName, Integer expires) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, InvalidExpiresRangeException, ServerException, InternalException, NoSuchAlgorithmException, XmlParserException, InvalidBucketNameException, ErrorResponseException { PostPolicy policy = new PostPolicy(bucketName, objectName, ZonedDateTime.now().plusDays(7)); policy.setContentType(“image/png”); return minioClient.presignedPostPolicy(policy); } /** * 将URLDecoder编码转成UTF8 * * @param str * @return * @throws UnsupportedEncodingException */ public static String getUtf8ByURLDecoder(String str) throws UnsupportedEncodingException { String url = str.replaceAll(“%(?![0-9a-fA-F]{2})”, “%25”); return URLDecoder.decode(url, “UTF-8”); } }
手写不易,有用请点赞!