[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-spring-boot-minio-gongju":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-minio-gongju","本文详细介绍了如何在 Spring Boot 项目中封装 MinIO 对象存储工具类，提供完整的配置和工具方法。 MinIO 简介 MinIO 是一款高性能、开源、兼容 Amazon S3 API 的分布式对象存储系统，专为云原生架构和大规模非结构化数据场景设计。其核心定位是成为私有云\u002F混合云环境中的标准存储方案，适用于从数据湖到 AI\u002FML、容器化部署等多样化需求。 项目结构 快速开始 1. POM 依赖配置 2. 启用自动配置 EnableAutoMinio 注解： Spring Boot 项目引入： 3. 配置文件 MinioProperties 配置类： 4. 内容类型枚举 核心工具类功能 1. 文件上传 普通文件上传： 分片上传： 2. 文件管理 文件存在性检查： 文件列表获取： 3. 文件下载 获取文件流： 断点下载： 4. 文件删除 批量删除： 5.","\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,37,"public,String,配置,bucketName,client","本文详细介绍了如何在 Spring Boot 项目中封装 MinIO 对象存储工具类，提供完整的配置和工具方法。 MinIO 简介 MinIO 是一款高性能、开源、兼容 Amazon S3 API 的分布式对象存储系统，专为云原生架构和大规模非结构化数据场景设计。其核心定位是成为私有云\u002F混合云环境中的标准存储方案，适用于从数据湖到 AI\u002FML、容器化部署等多样化需求。","2025-12-19 17:18:25"]