| package org.j****g.common.util.io; |
| |
| import cn.hutool.core.io.FileUtil; |
| import io.minio.*; |
| import io.minio.errors.MinioException; |
| import io.minio.http.Method; |
| import io.minio.messages.Bucket; |
| import io.minio.messages.DeleteError; |
| import io.minio.messages.DeleteObject; |
| import io.minio.messages.Item; |
| import lombok.Data; |
| import lombok.NoArgsConstructor; |
| import lombok.extern.slf4j.Slf4j; |
| import org.j****g.common.util.CN; |
| import org.j****g.common.util.DateUtils; |
| import org.j****g.common.util.network.RedisUtil; |
| import org.j****g.common.util.spring.SpringContextUtils; |
| import org.springframework.boot.context.properties.ConfigurationProperties; |
| import org.springframework.context.annotation.Configuration; |
| import org.springframework.stereotype.Component; |
| import org.springframework.web.multipart.MultipartFile; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.InputStream; |
| import java.util.Arrays; |
| import java.util.List; |
| import java.util.Optional; |
| import java.util.stream.Collectors; |
| |
| @Slf4j |
| public class MinIoUtil { |
| public static void main(String[] args) throws Exception { |
| File file = new File("C:\\Users\\e******0\\Desktop\\桌面文件\\测试图 横版01.png"); |
| String objectName = "img/" + file.getName(); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| String availableFileUrl = MinIoUtil.getAvailableFileUrl(objectName); |
| System.out.println("======availableFileUrl\n" + availableFileUrl); |
| } |
| |
| private static MinioClient minioClient; |
| private static String bucketName; |
| |
| static { |
| try { |
| MinIoConfig minIoConfig = new MinIoConfig("http://127.0.0.1:9000", "minioadmin", "minioadmin", "j****g"); |
| init(minIoConfig); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| public static void init(MinIoConfig minIoConfig) throws Exception { |
| bucketName = minIoConfig.getBucketName(); |
| minioClient = MinioClient.builder() |
| .endpoint(minIoConfig.getEndpoint()) |
| .credentials(minIoConfig.getAccessKey(), minIoConfig.getSecretKey()) |
| .build(); |
| |
| initBucket(); |
| log.info("成功连接上minio.URL:{} ,bucket {}", minIoConfig.getEndpoint(), bucketName); |
| } |
| |
| private static void initBucket() throws Exception { |
| |
| boolean found = doesBucketExist(bucketName); |
| |
| if (!found) { |
| minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); |
| log.info("成功创建 Bucket [{}]", bucketName); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static void putObject(InputStream is, String object, String contentType) throws Exception { |
| long start = System.currentTimeMillis(); |
| minioClient.putObject(PutObjectArgs.builder() |
| .bucket(bucketName) |
| .object(object) |
| .contentType(contentType) |
| .stream(is, -1, 1024 * 1024 * 10) |
| .build()); |
| log.info("成功上传文件至云端 [{}],耗时 [{} ms]", object, System.currentTimeMillis() - start); |
| } |
| |
| |
| |
| |
| |
| |
| |
| public static GetObjectResponse getObject(String object) throws Exception { |
| long start = System.currentTimeMillis(); |
| GetObjectResponse response = minioClient.getObject(GetObjectArgs.builder() |
| .bucket(bucketName) |
| .object(object) |
| .build()); |
| log.info("成功获取 Object [{}],耗时 [{} ms]", object, System.currentTimeMillis() - start); |
| return response; |
| } |
| |
| |
| |
| |
| |
| |
| public static void removeObject(String object) throws Exception { |
| minioClient.removeObject(RemoveObjectArgs.builder() |
| .bucket(bucketName) |
| .object(object) |
| .build()); |
| log.info("成功删除 Object [{}]", object); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static void createBucket(String bucketName) throws MinioException { |
| try { |
| if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { |
| minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); |
| } |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("create Bucket error!"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| public static boolean doesBucketExist(String bucketName) throws MinioException { |
| try { |
| return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("does Bucket Exist error!"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public static String getBucketPolicy(String bucketName) throws MinioException { |
| try { |
| return minioClient.getBucketPolicy(GetBucketPolicyArgs.builder().bucket(bucketName).build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("get Bucket Policy error!!"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| public static List<Bucket> getAllBuckets() throws MinioException { |
| try { |
| return minioClient.listBuckets(); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("get All Buckets error"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public static Optional<Bucket> getBucketInfo(String bucketName) throws MinioException { |
| try { |
| return getAllBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst(); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("get Buckets Info error"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| public static void removeBucket(String bucketName) throws MinioException { |
| try { |
| minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("remove Bucket error!!"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static boolean folderExist(String bucketName, String folderName) throws MinioException { |
| boolean exist = false; |
| try { |
| Iterable<Result<Item>> results = minioClient.listObjects( |
| ListObjectsArgs.builder().bucket(bucketName).prefix(folderName).recursive(false).build()); |
| for (Result<Item> result : results) { |
| Item item = result.get(); |
| if (item.isDir() && folderName.equals(item.objectName())) { |
| exist = true; |
| } |
| } |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("folderExist error!"); |
| } |
| return exist; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public static boolean objectExist(String bucketName, String objectName) { |
| boolean exist = true; |
| try { |
| minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); |
| } catch (Exception e) { |
| exist = false; |
| } |
| return exist; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static String getObjectUrl(String bucketName, String objectName, Integer expires) throws MinioException { |
| try { |
| return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs |
| .builder().bucket(bucketName).object(objectName).expiry(expires).method(Method.GET).build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("获取文件外链异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static String getObjectUrl(String bucketName, String objectName) throws MinioException { |
| try { |
| return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs |
| .builder().bucket(bucketName).object(objectName).expiry(24 * 60 * 60).method(Method.GET).build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("获取文件外链异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static GetObjectResponse getObject(String bucketName, String objectName) throws MinioException { |
| try { |
| return minioClient.getObject(GetObjectArgs.builder() |
| .bucket(bucketName) |
| .object(objectName) |
| .build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("获取对象异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static StatObjectResponse getObjectInfo(String bucketName, String objectName) throws MinioException { |
| try { |
| return minioClient.statObject( |
| StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("获取对象信息异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static GetObjectResponse getObject(String bucketName, String objectName, long offset, long length) throws MinioException { |
| try { |
| return minioClient.getObject( |
| GetObjectArgs.builder().bucket(bucketName).object(objectName).offset(offset).length(length).build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("断点下载异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public static ObjectWriteResponse putObject(String bucketName, MultipartFile file, String objectName, String contentType) throws MinioException { |
| try (InputStream inputStream = file.getInputStream()) { |
| return minioClient.putObject( |
| PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType) |
| .stream(inputStream, inputStream.available(), -1).build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("文件上传异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public static ObjectWriteResponse putObject(String bucketName, String objectName, String fileName) throws MinioException { |
| try { |
| return minioClient.uploadObject(UploadObjectArgs.builder() |
| .bucket(bucketName).object(objectName).filename(fileName).build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("上传本地文件异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public static ObjectWriteResponse putObjectByStream(String bucketName, String objectName, InputStream inputStream) throws MinioException { |
| try { |
| return minioClient.putObject( |
| PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(inputStream, inputStream.available(), -1) |
| .build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("通过流上传文件异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| public static ObjectWriteResponse createFolder(String bucketName, String objectName) throws MinioException { |
| try { |
| return minioClient.putObject( |
| PutObjectArgs.builder().bucket(bucketName).object(objectName).stream( |
| new ByteArrayInputStream(new byte[]{}), 0, -1) |
| .build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("文件夹创建异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static ObjectWriteResponse copyObject(String bucketName, String objectName, String srcBucketName, String srcObjectName) throws MinioException { |
| try { |
| return minioClient.copyObject( |
| CopyObjectArgs.builder() |
| .source(CopySource.builder().bucket(bucketName).object(objectName).build()) |
| .bucket(srcBucketName) |
| .object(srcObjectName) |
| .build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("拷贝文件 异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| public static void removeObject(String bucketName, String objectName) throws MinioException { |
| try { |
| minioClient.removeObject( |
| RemoveObjectArgs.builder() |
| .bucket(bucketName) |
| .object(objectName) |
| .build()); |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("删除文件 异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objectsName) throws MinioException { |
| try { |
| Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName) |
| .objects(objectsName.stream().map(DeleteObject::new).collect(Collectors.toList())).build()); |
| return results; |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("批量删除对象 异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static Iterable<Result<DeleteError>> removeObjects(String bucketName, String... objectName) throws MinioException { |
| try { |
| Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName) |
| .objects(Arrays.stream(objectName).map(DeleteObject::new).collect(Collectors.toList())).build()); |
| return results; |
| } catch (Exception e) { |
| log.error("minio 异常 {} ", e); |
| throw new MinioException("批量删除对象 异常"); |
| } |
| } |
| |
| |
| |
| |
| |
| public static String getAvailableFileUrl(String objectName) { |
| if (CN.isEmpty(objectName) || objectName.startsWith("http")) |
| return objectName; |
| String cc; |
| try { |
| RedisUtil redisUtil = SpringContextUtils.getBean(RedisUtil.class); |
| String redisKey = "minio_" + objectName; |
| boolean hasRedisUtil = redisUtil != null; |
| if (hasRedisUtil && redisUtil.hasKey(redisKey)) { |
| return redisUtil.getStr(redisKey); |
| } |
| int expires = 60 * 60 * 24 * 7 - 100; |
| cc = getObjectUrl(bucketName, objectName, expires); |
| if (hasRedisUtil) { |
| redisUtil.set(redisKey, cc, expires); |
| } |
| } catch (Exception e) { |
| String str = DateUtils.getNowStrForLogPre() + " 【getAvailableFileUrl 获取文件路径的 可访问链接 异常】 " + e.getMessage(); |
| System.out.println(str); |
| log.error(str, e); |
| cc = objectName; |
| } |
| return cc; |
| } |
| |
| @Data |
| @NoArgsConstructor |
| @Configuration |
| @Component |
| @ConfigurationProperties(prefix = "j****g.minio") |
| public static class MinIoConfig { |
| private String endpoint; |
| private String accessKey; |
| private String secretKey; |
| private String bucketName; |
| |
| public MinIoConfig(String endpoint, String accessKey, String secretKey, String bucketName) { |
| this.endpoint = endpoint; |
| this.accessKey = accessKey; |
| this.secretKey = secretKey; |
| this.bucketName = bucketName; |
| } |
| } |
| } |
| |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2022-05-10 SVN 改变文件名的大小写,提交后自动撤销更改
2019-05-10 log4net 配置
2019-05-10 EF 配置