Administrator
2023-08-25 7f21d4f22ec711d6aa89900b07e0b5ac31dbac42
ard-work/src/main/java/com/ruoyi/utils/minio/MinioUtil.java
ÎļþÃû´Ó ard-work/src/main/java/com/ruoyi/storage/minio/utils/MinioUtils.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.storage.minio.utils;
package com.ruoyi.utils.minio;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
@@ -6,39 +6,70 @@
import io.minio.http.Method;
import io.minio.messages.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.*;
import java.util.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
 * @Description: Minio客户端工具类
 * @ClassName: MinioUtils
 * @Description: minio工具类
 * @ClassName: MinioUtil
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´05月18日9:34
 * @Version: 1.0
 * @Date: 2023å¹´08月25日14:03:00
 **/
@SuppressWarnings("ALL")
@Slf4j(topic = "minio")
@Component
public class MinioUtils {
public class MinioUtil {
    @Resource
    MinioClient minioClient;
    private volatile static MinioClient minioClient;
    public static String domainUrl;
    public static String accessKey;
    public static String secretKey;
    private MinioUtil() {
    }
    public MinioUtil(String domainUrl, String accessKey, String secretKey) {
        this.domainUrl = domainUrl;
        this.accessKey = accessKey;
        this.secretKey = secretKey;
        creatMinioClient();
    }
    /**
     * èŽ·å–minio客户端实例
     *
     * @return {@link MinioClient}
     */
    public static MinioClient creatMinioClient() {
        if (minioClient == null) {
            synchronized (MinioUtil.class) {
                if (minioClient == null) {
                    minioClient = MinioClient.builder()
                            .endpoint(domainUrl)
                            .credentials(accessKey, secretKey)
                            .build();
                }
            }
        }
        return minioClient;
    }
    /**
     * åˆ¤æ–­æ¡¶æ˜¯å¦å­˜åœ¨
     */
    public boolean exitsBucket(String bucketName) {
    public static boolean exitsBucket(String bucket) {
        boolean found = false;
        try {
            if (StringUtils.isEmpty(bucketName)) {
            if (StringUtils.isEmpty(bucket)) {
                return false;
            }
            BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(bucketName).build();
            BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(bucket).build();
            found = minioClient.bucketExists(bucketExistsArgs);
        } catch (Exception ex) {
@@ -50,23 +81,23 @@
    /**
     * åˆ›å»ºæ¡¶,并设置桶策略为公共
     */
    public boolean createBucket(String bucketName) {
    public static boolean createBucket(String bucket) {
        try {
            if (StringUtils.isEmpty(bucketName)) {
            if (StringUtils.isEmpty(bucket)) {
                return false;
            }
            /*创建桶*/
            MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build();
            MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucket).build();
            minioClient.makeBucket(makeBucketArgs);
            /*设置策略*/
            String sb = "{\"Version\":\"2012-10-17\"," +
                    "\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" +
                    "{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"," +
                    "\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucketName +
                    "\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucket +
                    "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:PutObject\",\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\"],\"Resource\":[\"arn:aws:s3:::" +
                    bucketName + "/*\"]}]}";
                    bucket + "/*\"]}]}";
            SetBucketPolicyArgs setBucketPolicyArgs = SetBucketPolicyArgs.builder()
                    .bucket(bucketName)
                    .bucket(bucket)
                    .config(sb)
                    .build();
            /*设置通知mqtt*/
@@ -85,7 +116,7 @@
            queueConfigurations.add(queueConfiguration);
            config.setQueueConfigurationList(queueConfigurations);
            SetBucketNotificationArgs setBucketNotificationArgs = SetBucketNotificationArgs.builder()
                    .bucket(bucketName)
                    .bucket(bucket)
                    .config(config).build();
            minioClient.setBucketPolicy(setBucketPolicyArgs);
            minioClient.setBucketNotification(setBucketNotificationArgs);
@@ -102,7 +133,7 @@
     *
     * @param bucket æ¡¶åç§°
     */
    public boolean removeBucket(String bucket) {
    public static boolean removeBucket(String bucket) {
        try {
            boolean found = exitsBucket(bucket);
            if (found) {
@@ -130,7 +161,7 @@
     *
     * @return
     */
    public List<Bucket> getListBuckets() {
    public static List<Bucket> getListBuckets() {
        try {
            return minioClient.listBuckets();
        } catch (Exception e) {
@@ -143,19 +174,19 @@
     * ç”Ÿæˆä¸€ä¸ªGET请求的带有失效时间的分享链接。
     * å¤±æ•ˆæ—¶é—´é»˜è®¤æ˜¯7天。
     *
     * @param bucketName å­˜å‚¨æ¡¶åç§°
     * @param objectName å­˜å‚¨æ¡¶é‡Œçš„对象名称
     * @param expires    å¤±æ•ˆæ—¶é—´ï¼ˆä»¥ç§’为单位),默认是7天,不得大于七天
     * @param bucket  å­˜å‚¨æ¡¶åç§°
     * @param object  å­˜å‚¨æ¡¶é‡Œçš„对象名称
     * @param expires å¤±æ•ˆæ—¶é—´ï¼ˆä»¥ç§’为单位),默认是7天,不得大于七天
     * @return
     */
    public String getObjectWithExpired(String bucketName, String objectName, Integer expires, TimeUnit timeUnit) {
    public static String getObjectWithExpired(String bucket, String object, Integer expires, TimeUnit timeUnit) {
        String url = "";
        if (exitsBucket(bucketName)) {
        if (exitsBucket(bucket)) {
            try {
                GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder()
                        .method(Method.GET)
                        .bucket(bucketName)
                        .object(objectName)
                        .bucket(bucket)
                        .object(object)
                        .expiry(expires, timeUnit)
                        .build();
                url = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs);
@@ -163,7 +194,7 @@
                log.error("minio生成失效url异常", ex.getMessage());
            }
        } else {
            createBucket(bucketName);
            createBucket(bucket);
        }
        return url;
    }
@@ -176,20 +207,13 @@
     * @创建时间 2023/5/18 12:16
     * @修改人和其它信息
     */
    public String putObjectAndGetUrl(String bucketName, MultipartFile file) {
        if (!exitsBucket(bucketName)) {
            createBucket(bucketName);
    public static String putObjectAndGetUrl(String bucket, MultipartFile file) {
        if (!exitsBucket(bucket)) {
            createBucket(bucket);
        }
        //判断文件是否为空
        if (null == file || 0 == file.getSize()) {
            log.error("上传minio文件服务器错误,上传文件为空");
        }
        boolean exsit = exitsBucket(bucketName);
        if (!exsit) {
            boolean bucket = createBucket(bucketName);
            if (bucket) {
                log.info(bucketName + "-桶不存在,成功创建桶");
            }
        }
        //文件名
        String originalFilename = file.getOriginalFilename();
@@ -200,7 +224,7 @@
            /*上传对象*/
            PutObjectArgs putObjectArgs = PutObjectArgs
                    .builder()
                    .bucket(bucketName)
                    .bucket(bucket)
                    .object(fileName)
                    .stream(inputStream, file.getSize(), -1)
                    .contentType(file.getContentType())
@@ -210,7 +234,7 @@
            /*获取url*/
            GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs
                    .builder()
                    .bucket(bucketName)
                    .bucket(bucket)
                    .object(fileName)
                    .method(Method.GET)
                    .build();
@@ -231,20 +255,13 @@
     * @创建时间 2023/5/18 12:16
     * @修改人和其它信息
     */
    public String putObjectAndGetUrl(String bucketName, String folder, MultipartFile file) {
        if (!exitsBucket(bucketName)) {
            createBucket(bucketName);
    public static String putObjectAndGetUrl(String bucket, String folder, MultipartFile file) {
        if (!exitsBucket(bucket)) {
            createBucket(bucket);
        }
        //判断文件是否为空
        if (null == file || 0 == file.getSize()) {
            log.error("上传minio文件服务器错误,上传文件为空");
        }
        boolean exsit = exitsBucket(bucketName);
        if (!exsit) {
            boolean bucket = createBucket(bucketName);
            if (bucket) {
                log.info(bucketName + "-桶不存在,成功创建桶");
            }
        }
        //文件名
        String originalFilename = file.getOriginalFilename();
@@ -255,7 +272,7 @@
            /*上传对象*/
            PutObjectArgs putObjectArgs = PutObjectArgs
                    .builder()
                    .bucket(bucketName)
                    .bucket(bucket)
                    .object(fileName)
                    .stream(inputStream, file.getSize(), -1)
                    .contentType(file.getContentType())
@@ -265,7 +282,7 @@
            /*获取url*/
            GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs
                    .builder()
                    .bucket(bucketName)
                    .bucket(bucket)
                    .object(fileName)
                    .method(Method.GET)
                    .build();
@@ -281,15 +298,15 @@
    /**
     * åˆ é™¤æ–‡ä»¶
     *
     * @param bucket     æ¡¶åç§°
     * @param objectName å¯¹è±¡åç§°
     * @param bucket æ¡¶åç§°
     * @param object å¯¹è±¡åç§°
     * @return boolean
     */
    public boolean removeObject(String bucket, String objectName) {
    public static boolean removeObject(String bucket, String object) {
        try {
            boolean exsit = exitsBucket(bucket);
            if (exsit) {
                RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(objectName).build();
                RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(object).build();
                minioClient.removeObject(removeObjectArgs);
                return true;
            }
@@ -302,14 +319,14 @@
    /**
     * æ‰¹é‡åˆ é™¤æ–‡ä»¶
     *
     * @param objectNames å¯¹è±¡åç§°
     * @param objectList å¯¹è±¡åç§°åˆ—表
     * @return boolean
     */
    public boolean removeObjects(String bucket, List<String> objectNames) {
    public static boolean removeObjects(String bucket, List<String> objectList) {
        if (exitsBucket(bucket)) {
            try {
                List<DeleteObject> objects = new LinkedList<>();
                for (String str : objectNames) {
                for (String str : objectList) {
                    objects.add(new DeleteObject(str));
                }
                RemoveObjectsArgs removeObjectsArgs = RemoveObjectsArgs.builder().bucket(bucket).objects(objects).build();
@@ -334,7 +351,7 @@
     * @param bucket æ¡¶åç§°
     * @return {@link List}<{@link String}>
     */
    public List<String> getBucketObjectName(String bucket) {
    public static List<String> getBucketObjectName(String bucket) {
        boolean exsit = exitsBucket(bucket);
        if (exsit) {
            List<String> listObjetcName = new ArrayList<>();
@@ -356,10 +373,11 @@
    /**
     * èŽ·å–å•ä¸ªæ¡¶ä¸­çš„æ‰€æœ‰æ–‡ä»¶å¯¹è±¡åç§°
     *
     * @param [bucket,prefix]
     * @param bucket æ¡¶åç§°
     * @param prefix å‰ç¼€
     * @return {@link List}<{@link String}>
     */
    public List<String> getBucketObjectName(String bucket, String prefix) {
    public static List<String> getBucketObjectName(String bucket, String prefix) {
        boolean exsit = exitsBucket(bucket);
        if (exsit) {
            List<String> listObjetcName = new ArrayList<>();
@@ -381,19 +399,19 @@
    /**
     * èŽ·å–æŸä¸ªæ¡¶ä¸‹æŸä¸ªå¯¹è±¡çš„URL
     *
     * @param bucket     æ¡¶åç§°
     * @param objectName å¯¹è±¡å (文件夹名 + æ–‡ä»¶å)
     * @param bucket æ¡¶åç§°
     * @param object å¯¹è±¡å (文件夹名 + æ–‡ä»¶å)
     * @return
     */
    public String getBucketObjectUrl(String bucketName, String objectName) {
    public static String getBucketObjectUrl(String bucket, String object) {
        try {
            if (!exitsBucket(bucketName)) {
            if (!exitsBucket(bucket)) {
                return "";
            }
            GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs
                    .builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .bucket(bucket)
                    .object(object)
                    .method(Method.GET)
                    .build();
            String presignedObjectUrl = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs);
@@ -408,20 +426,20 @@
    /**
     * ä¸Šä¼ å¯¹è±¡-stream
     *
     * @param bucketName  bucket名称
     * @param objectName  â½‚件名称
     * @param bucket      bucket名称
     * @param object      â½‚件名称
     * @param stream      â½‚件流
     * @param size        â¼¤â¼©
     * @param contextType ç±»åž‹ Image/jpeg æµè§ˆå™¨å¯ä»¥ç›´æŽ¥æ‰“开,否则下载
     */
    public boolean uploadObject(String bucketName, String objectName, InputStream stream, long size, String contextType) {
    public static boolean uploadObject(String bucket, String object, InputStream stream, long size, String contextType) {
        try {
            if (!exitsBucket(bucketName)) {
                createBucket(bucketName);
            if (!exitsBucket(bucket)) {
                createBucket(bucket);
            }
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .bucket(bucket)
                    .object(object)
                    .stream(stream, size, -1)
                    .contentType(contextType)
                    .build();
@@ -436,20 +454,20 @@
    /**
     * ä¸Šä¼ å¯¹è±¡-File
     *
     * @param bucketName  bucket名称
     * @param objectName  â½‚件名称
     * @param bucket      bucket名称
     * @param object      â½‚件名称
     * @param file        â½‚ä»¶
     * @param contextType ç±»åž‹ Image/jpeg æµè§ˆå™¨å¯ä»¥ç›´æŽ¥æ‰“开,否则下载
     */
    public boolean uploadObject(String bucketName, String objectName, File file, String contextType) {
    public static boolean uploadObject(String bucket, String object, File file, String contextType) {
        try {
            if (!exitsBucket(bucketName)) {
                createBucket(bucketName);
            if (!exitsBucket(bucket)) {
                createBucket(bucket);
            }
            FileInputStream fileInputStream = new FileInputStream(file);
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .bucket(bucket)
                    .object(object)
                    .stream(fileInputStream, file.length(), -1)
                    .contentType(contextType)
                    .build();
@@ -464,20 +482,20 @@
    /**
     * ä¸Šä¼ å¯¹è±¡-MultipartFile
     *
     * @param bucketName    bucket名称
     * @param objectName    â½‚件名称
     * @param MultipartFile â½‚ä»¶
     * @param bucket        bucket名称
     * @param object        â½‚件名称
     * @param multipartFile â½‚ä»¶
     * @param contextType   ç±»åž‹ Image/jpeg æµè§ˆå™¨å¯ä»¥ç›´æŽ¥æ‰“开,否则下载
     */
    public boolean uploadObject(String bucketName, String objectName, MultipartFile multipartFile, String contextType) {
    public static boolean uploadObject(String bucket, String object, MultipartFile multipartFile, String contextType) {
        try {
            if (!exitsBucket(bucketName)) {
                createBucket(bucketName);
            if (!exitsBucket(bucket)) {
                createBucket(bucket);
            }
            InputStream inputStream = multipartFile.getInputStream();
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .bucket(bucket)
                    .object(object)
                    .stream(inputStream, multipartFile.getSize(), -1)
                    .contentType(contextType)
                    .build();
@@ -492,15 +510,14 @@
    /**
     * ä¸Šä¼ å¯¹è±¡,用multipartFile名称作为对象名
     *
     * @param bucketName    bucket名称
     * @param objectName    â½‚件名称
     * @param MultipartFile â½‚ä»¶
     * @param bucket        bucket名称
     * @param multipartFile â½‚ä»¶
     * @param contextType   ç±»åž‹ Image/jpeg æµè§ˆå™¨å¯ä»¥ç›´æŽ¥æ‰“开,否则下载
     */
    public boolean uploadObject(String bucketName, MultipartFile multipartFile, String contextType) {
    public static boolean uploadObject(String bucket, MultipartFile multipartFile, String contextType) {
        try {
            if (!exitsBucket(bucketName)) {
                createBucket(bucketName);
            if (!exitsBucket(bucket)) {
                createBucket(bucket);
            }
            if (multipartFile == null) {
                log.error("上传文件为空");
@@ -509,7 +526,7 @@
            String objectName = multipartFile.getOriginalFilename();
            InputStream inputStream = multipartFile.getInputStream();
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(bucketName)
                    .bucket(bucket)
                    .object(objectName)
                    .stream(inputStream, multipartFile.getSize(), -1)
                    .contentType(contextType)
@@ -525,15 +542,15 @@
    /**
     * ä¸Šä¼ å¯¹è±¡-通过本地路径
     *
     * @param bulkName
     * @param objectName
     * @param localFilePathName
     * @return
     * @param bucket            æ¡¶åç§°
     * @param object            å¯¹è±¡åç§°
     * @param localFilePathName æ–‡ä»¶è·¯å¾„
     * @return boolean
     */
    public boolean uploadObject(String bucketName, String objectName, String localFilePathName, String contextType) {
    public static boolean uploadObject(String bucket, String object, String localFilePathName, String contextType) {
        try {
            if (!exitsBucket(bucketName)) {
                createBucket(bucketName);
            if (!exitsBucket(bucket)) {
                createBucket(bucket);
            }
            File file = new File(localFilePathName);
            if (!file.exists()) {
@@ -541,8 +558,8 @@
                return false;
            }
            UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .bucket(bucket)
                    .object(object)
                    .filename(localFilePathName)
                    .contentType(contextType)
                    .build();
@@ -562,7 +579,7 @@
     * @创建时间 2023/2/6 10:32
     * @修改人和其它信息
     */
    public Iterable<Result<Item>> getObjectsByBucket(String bucketName) {
    public static Iterable<Result<Item>> getObjectsByBucket(String bucketName) {
        Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder()
                .bucket(bucketName)
                .recursive(true)
@@ -578,7 +595,7 @@
     * @创建时间 2023/2/6 10:32
     * @修改人和其它信息
     */
    public Iterable<Result<Item>> getObjectsByBucket(String bucketName, String prefix) {
    public static Iterable<Result<Item>> getObjectsByBucket(String bucketName, String prefix) {
        Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder()
                .bucket(bucketName)
                .prefix(prefix)
@@ -586,4 +603,5 @@
                .build());
        return listObjects;
    }
}
}