[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-spring-boot-fengzhuang-minio-gongjuleiwanzhengzhinan":3},{"id":4,"title":5,"slug":6,"summary":7,"content":8,"contentHtml":9,"wordCount":10,"readingTime":11,"categoryId":12,"tags":13,"coverImage":13,"thumbnail":13,"status":14,"isTop":15,"isRecommended":16,"allowComments":16,"password":13,"viewCount":17,"likeCount":16,"commentCount":16,"seoTitle":5,"seoKeywords":18,"seoDescription":19,"source":13,"sourceUrl":13,"publishTime":20},"2001945207893766145","Spring Boot 封装 MinIO 工具类完整指南","spring-boot-fengzhuang-minio-gongjuleiwanzhengzhinan","> 本文详细介绍了如何在 Spring Boot 项目中封装 MinIO 对象存储工具类，提供完整的配置和工具方法。 ## MinIO 简介 MinIO 是一款高性能、开源、兼容 Amazon S3 API 的分布式对象存储系统，专为云原生架构和大规模非结构化数据场景设计。其核心定位是成为私有云\u002F混合云环境中的标准存储方案，适用于从数据湖到 AI\u002FML、容器化部署等多样化需求。 ## 项目结构 ``` cdkj-minio ├── annotation # 注解 │ └── EnableAutoMinio # 启用自动 MinIO 配置 ├── config # 配置类 │ ├── MinioAutoConfiguration # MinIO 自动配置 │ ├── MinioMarkerConfiguration # MinIO 标记配置 │ └── MinioProperties # M...","\n> 本文详细介绍了如何在 Spring Boot 项目中封装 MinIO 对象存储工具类，提供完整的配置和工具方法。\n\n## MinIO 简介\n\nMinIO 是一款高性能、开源、兼容 Amazon S3 API 的分布式对象存储系统，专为云原生架构和大规模非结构化数据场景设计。其核心定位是成为私有云\u002F混合云环境中的标准存储方案，适用于从数据湖到 AI\u002FML、容器化部署等多样化需求。\n\n## 项目结构\n\n```\ncdkj-minio\n├── annotation                    # 注解\n│   └── EnableAutoMinio          # 启用自动 MinIO 配置\n├── config                        # 配置类\n│   ├── MinioAutoConfiguration   # MinIO 自动配置\n│   ├── MinioMarkerConfiguration # MinIO 标记配置\n│   └── MinioProperties          # MinIO 配置读取\n├── connectivity                  # 连接库\n│   └── MinioConfiguration       # MinIO 连接配置\n├── enums                         # 枚举库\n│   └── ContentTypeEnums         # 内容类型枚举\n└── MinioUtils                   # MinIO 工具类核心\n```\n\n## 快速开始\n\n### 1. POM 依赖配置\n\n```xml\n\u003Cdependencies>\n    \u003C!-- MinIO -->\n    \u003Cdependency>\n        \u003CgroupId>io.minio\u003C\u002FgroupId>\n        \u003CartifactId>minio\u003C\u002FartifactId>\n        \u003Cexclusions>\n            \u003Cexclusion>\n                \u003CgroupId>com.squareup.okhttp3\u003C\u002FgroupId>\n                \u003CartifactId>okhttp\u003C\u002FartifactId>\n            \u003C\u002Fexclusion>\n        \u003C\u002Fexclusions>\n    \u003C\u002Fdependency>\n    \u003Cdependency>\n        \u003CgroupId>com.squareup.okhttp3\u003C\u002FgroupId>\n        \u003CartifactId>okhttp\u003C\u002FartifactId>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n```\n\n### 2. 启用自动配置\n\n**EnableAutoMinio 注解：**\n```java\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@Import({MinioMarkerConfiguration.class})\npublic @interface EnableAutoMinio {}\n```\n\n**Spring Boot 项目引入：**\n```java\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\n@EnableRetry\n@EnableAsync\n@Configuration\n@EnableAutoMinio\n@EnableAutoMongo\n@EnableAutoCdkjJob\n@EnableDiscoveryClient\n@EnableTransactionManagement\n@EnableFeignClients(basePackages = {\"com.*.*.client\"})\npublic @interface EnableAutoApi {}\n```\n\n### 3. 配置文件\n\n**MinioProperties 配置类：**\n```java\n@Data\n@RefreshScope\n@Configuration\n@ConfigurationProperties(prefix = \"spring.minio\")\npublic class MinioProperties {\n    private String domain;        \u002F\u002F 访问域名\n    private String endpoint;     \u002F\u002F 存储端点\n    private Integer port;        \u002F\u002F 端口\n    private String accessKey;    \u002F\u002F 访问密钥\n    private String secretKey;    \u002F\u002F 密钥\n    private String bucketName;   \u002F\u002F 存储桶名称\n    private Integer expiry;      \u002F\u002F 分片对象过期时间(天)\n    private Integer breakpointTime; \u002F\u002F 断点续传有效时间(天)\n}\n```\n\n### 4. 内容类型枚举\n\n```java\npublic enum ContentTypeEnums {\n    DEFAULT(\"default\", \"application\u002Foctet-stream\"),\n    JPG(\"jpg\", \"image\u002Fjpeg\"),\n    PNG(\"png\", \"image\u002Fpng\"),\n    MP4(\"mp4\", \"video\u002Fmp4\");\n    \u002F\u002F ... 更多类型\n    \n    public static String formContentType(String suffix) {\n        \u002F\u002F 根据文件后缀获取 Content-Type\n    }\n}\n```\n\n## 核心工具类功能\n\n### 1. 文件上传\n\n**普通文件上传：**\n```java\npublic static ObjectWriteResponse uploadFile(String bucketName, \n                                           MultipartFile file, \n                                           String fileName, \n                                           ContentTypeEnums contentType) throws Exception {\n    InputStream inputStream = file.getInputStream();\n    return client.putObject(PutObjectArgs.builder()\n            .bucket(bucketName)\n            .object(fileName)\n            .contentType(contentType.getValue())\n            .stream(inputStream, inputStream.available(), -1)\n            .build());\n}\n```\n\n**分片上传：**\n```java\npublic static ResponseBuilder uploadFileFragment(MultipartFile file, \n                                                Integer currIndex, \n                                                Integer totalPieces, \n                                                String md5) throws Exception {\n    \u002F\u002F 分片上传实现，支持大文件断点续传\n}\n```\n\n### 2. 文件管理\n\n**文件存在性检查：**\n```java\npublic static boolean isFileExist(String bucketName, String fileName) {\n    try {\n        client.statObject(StatObjectArgs.builder()\n                .bucket(bucketName)\n                .object(fileName)\n                .build());\n        return true;\n    } catch (Exception e) {\n        return false;\n    }\n}\n```\n\n**文件列表获取：**\n```java\npublic static Iterable\u003CResult\u003CItem>> getFilesByPrefix(String bucketName, \n                                                     String prefix, \n                                                     boolean recursive) {\n    return client.listObjects(ListObjectsArgs.builder()\n            .bucket(bucketName)\n            .prefix(prefix)\n            .recursive(recursive)\n            .build());\n}\n```\n\n### 3. 文件下载\n\n**获取文件流：**\n```java\npublic InputStream getFileStream(String bucketName, String fileName) throws Exception {\n    return client.getObject(GetObjectArgs.builder()\n            .bucket(bucketName)\n            .object(fileName)\n            .build());\n}\n```\n\n**断点下载：**\n```java\npublic InputStream getFileStream(String bucketName, String fileName, \n                               long offset, long length) throws Exception {\n    return client.getObject(GetObjectArgs.builder()\n            .bucket(bucketName)\n            .object(fileName)\n            .offset(offset)\n            .length(length)\n            .build());\n}\n```\n\n### 4. 文件删除\n\n**批量删除：**\n```java\npublic static Iterable\u003CResult\u003CDeleteError>> removeFiles(String bucketName, \n                                                       List\u003CString> filePaths) {\n    List\u003CDeleteObject> objectPaths = filePaths.stream()\n            .map(DeleteObject::new)\n            .collect(Collectors.toList());\n    return client.removeObjects(RemoveObjectsArgs.builder()\n            .bucket(bucketName)\n            .objects(objectPaths)\n            .build());\n}\n```\n\n### 5. 预签名 URL\n\n**生成临时访问链接：**\n```java\npublic static String getPresignedObjectUrl(String bucketName, String fileName) throws Exception {\n    GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()\n            .bucket(bucketName)\n            .object(fileName)\n            .method(Method.GET)\n            .build();\n    return client.getPresignedObjectUrl(args);\n}\n```\n\n## 自动配置原理\n\n### 配置标记类\n```java\n@Configuration(proxyBeanMethods = false)\npublic class MinioMarkerConfiguration {\n    @Bean\n    public Marker mybatisMarker() {\n        return new Marker();\n    }\n    public static class Marker {}\n}\n```\n\n### 自动配置类\n```java\n@Lazy(false)\n@Configuration(proxyBeanMethods = false)\n@EnableConfigurationProperties({MinioProperties.class})\n@AutoConfigureAfter({WebClientAutoConfiguration.class})\n@ConditionalOnBean(MinioMarkerConfiguration.Marker.class)\npublic class MinioAutoConfiguration {\n    \n    @Bean(initMethod = \"start\")\n    public MinioConfiguration minioConfiguration() {\n        return new MinioConfiguration(minioProperties);\n    }\n}\n```\n\n### 连接配置\n```java\npublic class MinioConfiguration {\n    public void start() {\n        MinioClient.Builder builder = MinioClient.builder();\n        if (minioProperties.getPort() == null) {\n            builder.endpoint(minioProperties.getEndpoint());\n        } else {\n            builder.endpoint(minioProperties.getEndpoint(), \n                           minioProperties.getPort(), false);\n        }\n        \n        MinioClient client = builder\n                .credentials(minioProperties.getAccessKey(), \n                           minioProperties.getSecretKey())\n                .build();\n                \n        new MinioUtils(client); \u002F\u002F 实例化工具类\n    }\n}\n```\n\n## Spring Boot 3.x 支持\n\n在 `resources\u002FMETA-INF\u002Fspring` 目录下创建 `org.springframework.boot.autoconfigure.AutoConfiguration.imports` 文件：\n\n```\ncom.cdkjframework.minio.config.MinioAutoConfiguration\n```\n\n## 总结\n\nSpring Boot 封装 MinIO 工具的核心意义在于将分布式存储能力转化为可复用的基础设施，通过标准化、模块化的设计，显著降低开发复杂度，提升系统健壮性和可维护性。这种封装不仅是技术层面的优化，更是工程实践中的最佳选择，尤其适用于需要快速迭代、高并发处理及多云兼容的现代应用架构。\n\n**主要特性：**\n- 开箱即用的自动配置\n- 完整的分片上传支持\n- 灵活的预签名 URL 生成\n- 完善的异常处理机制\n- 与 Spring Boot 生态无缝集成\n\n**开源地址：**\n- Gitee: https:\u002F\u002Fgitee.com\u002Fcdkjframework\n- Github: https:\u002F\u002Fgithub.com\u002Fcdkjframework\n\n如果觉得项目对你有帮助，欢迎 Star 和 Fork！如有问题或建议，欢迎留言讨论。","\u003Cblockquote data-line=\"1\">\n\u003Cp data-line=\"1\">本文详细介绍了如何在 Spring Boot 项目中封装 MinIO 对象存储工具类，提供完整的配置和工具方法。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2 data-line=\"3\" id=\"MinIO 简介\">MinIO 简介\u003C\u002Fh2>\n\u003Cp data-line=\"5\">MinIO 是一款高性能、开源、兼容 Amazon S3 API 的分布式对象存储系统，专为云原生架构和大规模非结构化数据场景设计。其核心定位是成为私有云\u002F混合云环境中的标准存储方案，适用于从数据湖到 AI\u002FML、容器化部署等多样化需求。\u003C\u002Fp>\n\u003Ch2 data-line=\"7\" id=\"项目结构\">项目结构\u003C\u002Fh2>\n\n        \u003Cdetails  data-line=\"9\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-\" language=>\u003Cspan class=\"md-editor-code-block\">cdkj-minio\n├── annotation                    \u003Cspan class=\"hljs-comment\"># 注解\u003C\u002Fspan>\n│   └── EnableAutoMinio          \u003Cspan class=\"hljs-comment\"># 启用自动 MinIO 配置\u003C\u002Fspan>\n├── config                        \u003Cspan class=\"hljs-comment\"># 配置类\u003C\u002Fspan>\n│   ├── MinioAutoConfiguration   \u003Cspan class=\"hljs-comment\"># MinIO 自动配置\u003C\u002Fspan>\n│   ├── MinioMarkerConfiguration \u003Cspan class=\"hljs-comment\"># MinIO 标记配置\u003C\u002Fspan>\n│   └── MinioProperties          \u003Cspan class=\"hljs-comment\"># MinIO 配置读取\u003C\u002Fspan>\n├── connectivity                  \u003Cspan class=\"hljs-comment\"># 连接库\u003C\u002Fspan>\n│   └── MinioConfiguration       \u003Cspan class=\"hljs-comment\"># MinIO 连接配置\u003C\u002Fspan>\n├── enums                         \u003Cspan class=\"hljs-comment\"># 枚举库\u003C\u002Fspan>\n│   └── ContentTypeEnums         \u003Cspan class=\"hljs-comment\"># 内容类型枚举\u003C\u002Fspan>\n└── MinioUtils                   \u003Cspan class=\"hljs-comment\"># MinIO 工具类核心\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"24\" id=\"快速开始\">快速开始\u003C\u002Fh2>\n\u003Ch3 data-line=\"26\" id=\"1. POM 依赖配置\">1. POM 依赖配置\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"28\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">xml\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-xml\" language=xml>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependencies\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-comment\">&lt;!-- MinIO --&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>io.minio\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>minio\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">exclusions\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">exclusion\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n                \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>com.squareup.okhttp3\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n                \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>okhttp\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">exclusion\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">exclusions\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>com.squareup.okhttp3\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>okhttp\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependencies\u003C\u002Fspan>&gt;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"48\" id=\"2. 启用自动配置\">2. 启用自动配置\u003C\u002Fh3>\n\u003Cp data-line=\"50\">\u003Cstrong>EnableAutoMinio 注解：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"51\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-meta\">@Target(ElementType.TYPE)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Retention(RetentionPolicy.RUNTIME)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Documented\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Import({MinioMarkerConfiguration.class})\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-meta\">@interface\u003C\u002Fspan> EnableAutoMinio {}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"59\">\u003Cstrong>Spring Boot 项目引入：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"60\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-meta\">@Target(ElementType.TYPE)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Retention(RetentionPolicy.RUNTIME)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@EnableRetry\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@EnableAsync\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Configuration\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@EnableAutoMinio\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@EnableAutoMongo\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@EnableAutoCdkjJob\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@EnableDiscoveryClient\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@EnableTransactionManagement\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@EnableFeignClients(basePackages = {&quot;com.*.*.client&quot;})\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-meta\">@interface\u003C\u002Fspan> EnableAutoApi {}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"75\" id=\"3. 配置文件\">3. 配置文件\u003C\u002Fh3>\n\u003Cp data-line=\"77\">\u003Cstrong>MinioProperties 配置类：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"78\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-meta\">@Data\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@RefreshScope\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Configuration\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@ConfigurationProperties(prefix = &quot;spring.minio&quot;)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">MinioProperties\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> String domain;        \u003Cspan class=\"hljs-comment\">\u002F\u002F 访问域名\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> String endpoint;     \u003Cspan class=\"hljs-comment\">\u002F\u002F 存储端点\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> Integer port;        \u003Cspan class=\"hljs-comment\">\u002F\u002F 端口\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> String accessKey;    \u003Cspan class=\"hljs-comment\">\u002F\u002F 访问密钥\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> String secretKey;    \u003Cspan class=\"hljs-comment\">\u002F\u002F 密钥\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> String bucketName;   \u003Cspan class=\"hljs-comment\">\u002F\u002F 存储桶名称\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> Integer expiry;      \u003Cspan class=\"hljs-comment\">\u002F\u002F 分片对象过期时间(天)\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> Integer breakpointTime; \u003Cspan class=\"hljs-comment\">\u002F\u002F 断点续传有效时间(天)\u003C\u002Fspan>\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"95\" id=\"4. 内容类型枚举\">4. 内容类型枚举\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"97\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">enum\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ContentTypeEnums\u003C\u002Fspan> {\n    DEFAULT(\u003Cspan class=\"hljs-string\">&quot;default&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;application\u002Foctet-stream&quot;\u003C\u002Fspan>),\n    JPG(\u003Cspan class=\"hljs-string\">&quot;jpg&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;image\u002Fjpeg&quot;\u003C\u002Fspan>),\n    PNG(\u003Cspan class=\"hljs-string\">&quot;png&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;image\u002Fpng&quot;\u003C\u002Fspan>),\n    MP4(\u003Cspan class=\"hljs-string\">&quot;mp4&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;video\u002Fmp4&quot;\u003C\u002Fspan>);\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F ... 更多类型\u003C\u002Fspan>\n    \n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> String \u003Cspan class=\"hljs-title function_\">formContentType\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String suffix)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 根据文件后缀获取 Content-Type\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"111\" id=\"核心工具类功能\">核心工具类功能\u003C\u002Fh2>\n\u003Ch3 data-line=\"113\" id=\"1. 文件上传\">1. 文件上传\u003C\u002Fh3>\n\u003Cp data-line=\"115\">\u003Cstrong>普通文件上传：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"116\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> ObjectWriteResponse \u003Cspan class=\"hljs-title function_\">uploadFile\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String bucketName, \n                                           MultipartFile file, \n                                           String fileName, \n                                           ContentTypeEnums contentType)\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">throws\u003C\u002Fspan> Exception {\n    \u003Cspan class=\"hljs-type\">InputStream\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">inputStream\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> file.getInputStream();\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> client.putObject(PutObjectArgs.builder()\n            .bucket(bucketName)\n            .object(fileName)\n            .contentType(contentType.getValue())\n            .stream(inputStream, inputStream.available(), -\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>)\n            .build());\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"131\">\u003Cstrong>分片上传：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"132\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> ResponseBuilder \u003Cspan class=\"hljs-title function_\">uploadFileFragment\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(MultipartFile file, \n                                                Integer currIndex, \n                                                Integer totalPieces, \n                                                String md5)\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">throws\u003C\u002Fspan> Exception {\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 分片上传实现，支持大文件断点续传\u003C\u002Fspan>\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"141\" id=\"2. 文件管理\">2. 文件管理\u003C\u002Fh3>\n\u003Cp data-line=\"143\">\u003Cstrong>文件存在性检查：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"144\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">isFileExist\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String bucketName, String fileName)\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">try\u003C\u002Fspan> {\n        client.statObject(StatObjectArgs.builder()\n                .bucket(bucketName)\n                .object(fileName)\n                .build());\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">true\u003C\u002Fspan>;\n    } \u003Cspan class=\"hljs-keyword\">catch\u003C\u002Fspan> (Exception e) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">false\u003C\u002Fspan>;\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"158\">\u003Cstrong>文件列表获取：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"159\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> Iterable&lt;Result&lt;Item&gt;&gt; \u003Cspan class=\"hljs-title function_\">getFilesByPrefix\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String bucketName, \n                                                     String prefix, \n                                                     \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> recursive)\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> client.listObjects(ListObjectsArgs.builder()\n            .bucket(bucketName)\n            .prefix(prefix)\n            .recursive(recursive)\n            .build());\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"171\" id=\"3. 文件下载\">3. 文件下载\u003C\u002Fh3>\n\u003Cp data-line=\"173\">\u003Cstrong>获取文件流：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"174\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> InputStream \u003Cspan class=\"hljs-title function_\">getFileStream\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String bucketName, String fileName)\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">throws\u003C\u002Fspan> Exception {\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> client.getObject(GetObjectArgs.builder()\n            .bucket(bucketName)\n            .object(fileName)\n            .build());\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"183\">\u003Cstrong>断点下载：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"184\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> InputStream \u003Cspan class=\"hljs-title function_\">getFileStream\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String bucketName, String fileName, \n                               \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> offset, \u003Cspan class=\"hljs-type\">long\u003C\u002Fspan> length)\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">throws\u003C\u002Fspan> Exception {\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> client.getObject(GetObjectArgs.builder()\n            .bucket(bucketName)\n            .object(fileName)\n            .offset(offset)\n            .length(length)\n            .build());\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"196\" id=\"4. 文件删除\">4. 文件删除\u003C\u002Fh3>\n\u003Cp data-line=\"198\">\u003Cstrong>批量删除：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"199\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> Iterable&lt;Result&lt;DeleteError&gt;&gt; \u003Cspan class=\"hljs-title function_\">removeFiles\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String bucketName, \n                                                       List&lt;String&gt; filePaths)\u003C\u002Fspan> {\n    List&lt;DeleteObject&gt; objectPaths = filePaths.stream()\n            .map(DeleteObject::\u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan>)\n            .collect(Collectors.toList());\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> client.removeObjects(RemoveObjectsArgs.builder()\n            .bucket(bucketName)\n            .objects(objectPaths)\n            .build());\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"212\" id=\"5. 预签名 URL\">5. 预签名 URL\u003C\u002Fh3>\n\u003Cp data-line=\"214\">\u003Cstrong>生成临时访问链接：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"215\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> String \u003Cspan class=\"hljs-title function_\">getPresignedObjectUrl\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String bucketName, String fileName)\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">throws\u003C\u002Fspan> Exception {\n    \u003Cspan class=\"hljs-type\">GetPresignedObjectUrlArgs\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">args\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> GetPresignedObjectUrlArgs.builder()\n            .bucket(bucketName)\n            .object(fileName)\n            .method(Method.GET)\n            .build();\n    \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> client.getPresignedObjectUrl(args);\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"226\" id=\"自动配置原理\">自动配置原理\u003C\u002Fh2>\n\u003Ch3 data-line=\"228\" id=\"配置标记类\">配置标记类\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"229\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-meta\">@Configuration(proxyBeanMethods = false)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">MinioMarkerConfiguration\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-meta\">@Bean\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> Marker \u003Cspan class=\"hljs-title function_\">mybatisMarker\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Marker\u003C\u002Fspan>();\n    }\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Marker\u003C\u002Fspan> {}\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"240\" id=\"自动配置类\">自动配置类\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"241\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-meta\">@Lazy(false)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@Configuration(proxyBeanMethods = false)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@EnableConfigurationProperties({MinioProperties.class})\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@AutoConfigureAfter({WebClientAutoConfiguration.class})\u003C\u002Fspan>\n\u003Cspan class=\"hljs-meta\">@ConditionalOnBean(MinioMarkerConfiguration.Marker.class)\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">MinioAutoConfiguration\u003C\u002Fspan> {\n    \n    \u003Cspan class=\"hljs-meta\">@Bean(initMethod = &quot;start&quot;)\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> MinioConfiguration \u003Cspan class=\"hljs-title function_\">minioConfiguration\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">MinioConfiguration\u003C\u002Fspan>(minioProperties);\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"256\" id=\"连接配置\">连接配置\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"257\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">MinioConfiguration\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">start\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan> {\n        MinioClient.\u003Cspan class=\"hljs-type\">Builder\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">builder\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> MinioClient.builder();\n        \u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (minioProperties.getPort() == \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan>) {\n            builder.endpoint(minioProperties.getEndpoint());\n        } \u003Cspan class=\"hljs-keyword\">else\u003C\u002Fspan> {\n            builder.endpoint(minioProperties.getEndpoint(), \n                           minioProperties.getPort(), \u003Cspan class=\"hljs-literal\">false\u003C\u002Fspan>);\n        }\n        \n        \u003Cspan class=\"hljs-type\">MinioClient\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">client\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> builder\n                .credentials(minioProperties.getAccessKey(), \n                           minioProperties.getSecretKey())\n                .build();\n                \n        \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">MinioUtils\u003C\u002Fspan>(client); \u003Cspan class=\"hljs-comment\">\u002F\u002F 实例化工具类\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"278\" id=\"Spring Boot 3.x 支持\">Spring Boot 3.x 支持\u003C\u002Fh2>\n\u003Cp data-line=\"280\">在 \u003Ccode>resources\u002FMETA-INF\u002Fspring\u003C\u002Fcode> 目录下创建 \u003Ccode>org.springframework.boot.autoconfigure.AutoConfiguration.imports\u003C\u002Fcode> 文件：\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"282\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-\" language=>\u003Cspan class=\"md-editor-code-block\">com.cdkjframework.minio.\u003Cspan class=\"hljs-built_in\">config\u003C\u002Fspan>.MinioAutoConfiguration\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"286\" id=\"总结\">总结\u003C\u002Fh2>\n\u003Cp data-line=\"288\">Spring Boot 封装 MinIO 工具的核心意义在于将分布式存储能力转化为可复用的基础设施，通过标准化、模块化的设计，显著降低开发复杂度，提升系统健壮性和可维护性。这种封装不仅是技术层面的优化，更是工程实践中的最佳选择，尤其适用于需要快速迭代、高并发处理及多云兼容的现代应用架构。\u003C\u002Fp>\n\u003Cp data-line=\"290\">\u003Cstrong>主要特性：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul data-line=\"291\">\n\u003Cli data-line=\"291\">开箱即用的自动配置\u003C\u002Fli>\n\u003Cli data-line=\"292\">完整的分片上传支持\u003C\u002Fli>\n\u003Cli data-line=\"293\">灵活的预签名 URL 生成\u003C\u002Fli>\n\u003Cli data-line=\"294\">完善的异常处理机制\u003C\u002Fli>\n\u003Cli data-line=\"295\">与 Spring Boot 生态无缝集成\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp data-line=\"297\">\u003Cstrong>开源地址：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul data-line=\"298\">\n\u003Cli data-line=\"298\">Gitee: \u003Ca href=\"https:\u002F\u002Fgitee.com\u002Fcdkjframework\">https:\u002F\u002Fgitee.com\u002Fcdkjframework\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli data-line=\"299\">Github: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcdkjframework\">https:\u002F\u002Fgithub.com\u002Fcdkjframework\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp data-line=\"301\">如果觉得项目对你有帮助，欢迎 Star 和 Fork！如有问题或建议，欢迎留言讨论。\u003C\u002Fp>\n",7403,24,"0","",2,1,0,9,"复制,public,代码,String,bucketName","\n本文详细介绍了如何在 Spring Boot 项目中封装 MinIO 对象存储工具类，提供完整的配置和工具方法。\n\nMinIO 简介\nMinIO 是一款高性能、开源、兼容 Amazon S3 API 的分布式对象存储系统，专为云原生架构和大规模非结构化数据场景设计。其核心定位是成为私有云\u002F混合云环境中的标准存储方案，适用于从数据湖到 AI\u002FML、容器化部署等多样化需求。","2025-12-19 17:18:25"]