| File was renamed from src/main/java/com/ard/utils/minio/MinioUtils.java |
| | |
| | | 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.File; |
| | | import java.io.FileInputStream; |
| | | import java.io.InputStream; |
| | |
| | | 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) { |
| | |
| | | /** |
| | | * 创建桶,并设置桶策略为公共 |
| | | */ |
| | | 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*/ |
| | |
| | | queueConfigurations.add(queueConfiguration); |
| | | config.setQueueConfigurationList(queueConfigurations); |
| | | SetBucketNotificationArgs setBucketNotificationArgs = SetBucketNotificationArgs.builder() |
| | | .bucket(bucketName) |
| | | .bucket(bucket) |
| | | .config(config).build(); |
| | | minioClient.setBucketPolicy(setBucketPolicyArgs); |
| | | minioClient.setBucketNotification(setBucketNotificationArgs); |
| | |
| | | * |
| | | * @param bucket 桶名称 |
| | | */ |
| | | public boolean removeBucket(String bucket) { |
| | | public static boolean removeBucket(String bucket) { |
| | | try { |
| | | boolean found = exitsBucket(bucket); |
| | | if (found) { |
| | |
| | | * |
| | | * @return |
| | | */ |
| | | public List<Bucket> getListBuckets() { |
| | | public static List<Bucket> getListBuckets() { |
| | | try { |
| | | return minioClient.listBuckets(); |
| | | } catch (Exception e) { |
| | |
| | | * 生成一个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); |
| | |
| | | log.error("minio生成失效url异常", ex.getMessage()); |
| | | } |
| | | } else { |
| | | createBucket(bucketName); |
| | | createBucket(bucket); |
| | | } |
| | | return url; |
| | | } |
| | |
| | | * @创建时间 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(); |
| | |
| | | /*上传对象*/ |
| | | PutObjectArgs putObjectArgs = PutObjectArgs |
| | | .builder() |
| | | .bucket(bucketName) |
| | | .bucket(bucket) |
| | | .object(fileName) |
| | | .stream(inputStream, file.getSize(), -1) |
| | | .contentType(file.getContentType()) |
| | |
| | | /*获取url*/ |
| | | GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs |
| | | .builder() |
| | | .bucket(bucketName) |
| | | .bucket(bucket) |
| | | .object(fileName) |
| | | .method(Method.GET) |
| | | .build(); |
| | |
| | | * @创建时间 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(); |
| | |
| | | /*上传对象*/ |
| | | PutObjectArgs putObjectArgs = PutObjectArgs |
| | | .builder() |
| | | .bucket(bucketName) |
| | | .bucket(bucket) |
| | | .object(fileName) |
| | | .stream(inputStream, file.getSize(), -1) |
| | | .contentType(file.getContentType()) |
| | |
| | | /*获取url*/ |
| | | GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs |
| | | .builder() |
| | | .bucket(bucketName) |
| | | .bucket(bucket) |
| | | .object(fileName) |
| | | .method(Method.GET) |
| | | .build(); |
| | |
| | | /** |
| | | * 删除文件 |
| | | * |
| | | * @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; |
| | | } |
| | |
| | | /** |
| | | * 批量删除文件 |
| | | * |
| | | * @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(); |
| | |
| | | * @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<>(); |
| | |
| | | |
| | | /** |
| | | * 获取单个桶中的所有文件对象名称 |
| | | * @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<>(); |
| | |
| | | /** |
| | | * 获取某个桶下某个对象的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); |
| | |
| | | /** |
| | | * 上传对象-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(); |
| | |
| | | /** |
| | | * 上传对象-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(); |
| | |
| | | /** |
| | | * 上传对象-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(); |
| | |
| | | /** |
| | | * 上传对象,用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("上传文件为空"); |
| | |
| | | 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) |
| | |
| | | /** |
| | | * 上传对象-通过本地路径 |
| | | * |
| | | * @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()) { |
| | |
| | | return false; |
| | | } |
| | | UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder() |
| | | .bucket(bucketName) |
| | | .object(objectName) |
| | | .bucket(bucket) |
| | | .object(object) |
| | | .filename(localFilePathName) |
| | | .contentType(contextType) |
| | | .build(); |
| | |
| | | * @创建时间 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) |
| | |
| | | |
| | | /** |
| | | * @描述 获取桶中所有对象 |
| | | * @参数 [bucketName,prefix] |
| | | * @参数 [bucketName, prefix] |
| | | * @返回值 java.lang.Iterable<io.minio.Result < io.minio.messages.Item>> |
| | | * @创建人 刘苏义 |
| | | * @创建时间 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) |
| | |
| | | .build()); |
| | | return listObjects; |
| | | } |
| | | } |
| | | |
| | | } |