当前位置: 首页 > ds >正文

springboot集成minio详细流程代码

maven依赖:

        <!-- minio的官方依赖(目前最新) --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.14</version><exclusions><exclusion><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.11.0</version> <!-- 确保使用4.11.0或更高版本 --></dependency>

yaml配置:

# MinIO 配置
minio:endpoint: http://xxx.xx.xx.xx:9000accesskey: adminsecretKey: xxxxbucketName: workconnectTimeout: 60000writeTimeout: 60000readTimeout: 60000
package com.r.minio.config;import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Auther: ZHANG PU* @Date: 2025/6/12 09:10* @Description:*/
@Configuration
public class MinioConfig {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.accesskey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
}
package com.r.minio.properties;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** @Auther: ZHANG PU* @Date: 2025/6/12 09:53* @Description:*/
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {private String endpoint;private String accessKey;private String secretKey;private String bucketName;private Integer connectTimeout;private Integer writeTimeout;private Integer readTimeout;public String getEndpoint() {return endpoint;}public void setEndpoint(String endpoint) {this.endpoint = endpoint;}public String getAccessKey() {return accessKey;}public void setAccessKey(String accessKey) {this.accessKey = accessKey;}public String getSecretKey() {return secretKey;}public void setSecretKey(String secretKey) {this.secretKey = secretKey;}public String getBucketName() {return bucketName;}public void setBucketName(String bucketName) {this.bucketName = bucketName;}public Integer getConnectTimeout() {return connectTimeout;}public void setConnectTimeout(Integer connectTimeout) {this.connectTimeout = connectTimeout;}public Integer getWriteTimeout() {return writeTimeout;}public void setWriteTimeout(Integer writeTimeout) {this.writeTimeout = writeTimeout;}public Integer getReadTimeout() {return readTimeout;}public void setReadTimeout(Integer readTimeout) {this.readTimeout = readTimeout;}
}
package com.r.minio.service;import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;
import java.util.Map;/*** @Auther: ZHANG PU* @Date: 2025/6/12 10:01* @Description:*/
public interface MinioService {/*** 上传文件*/String uploadFile(MultipartFile file);/*** 上传文件到指定存储桶*/String uploadFile(MultipartFile file, String bucketName);/*** 功能描述: 上传文件到指定目录指定桶** @param file* @param path       文件路径  xxx/xxx/* @param bucketName* @author zhang pu* @date 10:32 2025/6/12*/String uploadFile(MultipartFile file, String path, String bucketName);/*** 上传文件并设置元数据*/String uploadFile(MultipartFile file, Map<String, String> metadata);/*** 上传文件流*/String uploadFile(InputStream stream, String fileName, String contentType);/*** 功能描述: 获取文件访问url** @param objectName* @author zhang pu* @date 10:40 2025/6/12*/String getObjectUrl(String objectName);/*** 获取文件访问URL(带过期时间)*/String getObjectUrl(String objectName, Integer expires);/*** 删除文件*/boolean removeFile(String objectName);/*** 功能描述: 删除文件如果又目录必须带上目录** @param bucketName* @param objectName* @author zhang pu* @date 10:39 2025/6/12*/boolean removeFile(String bucketName, String objectName);/*** 功能描述: 检查桶是否存在** @param bucketName* @author zhang pu* @date 10:39 2025/6/12*/boolean bucketExists(String bucketName);/*** 功能描述: 创建桶** @param bucketName* @author zhang pu* @date 10:39 2025/6/12*/void makeBucket(String bucketName);
}
package com.r.minio.service.impl;import com.r.minio.service.MinioService;
import com.r.minio.properties.MinioProperties;
import io.minio.*;
import io.minio.http.Method;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;
import java.util.Map;
import java.util.UUID;/*** @Auther: ZHANG PU* @Date: 2025/6/12 10:02* @Description:*/
@Slf4j
@Service
public class MinioServiceImpl implements MinioService {@Autowiredprivate  MinioClient minioClient;@Autowiredprivate  MinioProperties minioProperties;@Overridepublic String uploadFile(MultipartFile file) {return uploadFile(file, minioProperties.getBucketName());}@Overridepublic String uploadFile(MultipartFile file,String path ,String bucketName) {try{// 检查存储桶是否存在if (!bucketExists(bucketName)){makeBucket(bucketName);}// 生成文件名String originalFilename = file.getOriginalFilename();assert originalFilename != null;String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));// 上传文件PutObjectArgs args = PutObjectArgs.builder().bucket(bucketName).object(path+fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();minioClient.putObject(args);log.info("文件上传成功: {}", fileName);return fileName;} catch (Exception e){log.error("文件上传失败: {}", e.getMessage(), e);throw new RuntimeException("文件上传失败", e);}}@Overridepublic String uploadFile(MultipartFile file, String bucketName) {try{// 检查存储桶是否存在if (!bucketExists(bucketName)){makeBucket(bucketName);}// 生成文件名String originalFilename = file.getOriginalFilename();assert originalFilename != null;String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));// 上传文件PutObjectArgs args = PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();minioClient.putObject(args);log.info("文件上传成功: {}", fileName);return fileName;} catch (Exception e){log.error("文件上传失败: {}", e.getMessage(), e);throw new RuntimeException("文件上传失败", e);}}@Overridepublic String uploadFile(MultipartFile file, Map<String, String> metadata) {try{// 检查存储桶是否存在String bucketName = minioProperties.getBucketName();if (!bucketExists(bucketName)){makeBucket(bucketName);}// 生成文件名String originalFilename = file.getOriginalFilename();assert originalFilename != null;String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));// 上传文件并设置元数据PutObjectArgs args = PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).userMetadata(metadata).build();minioClient.putObject(args);log.info("文件上传成功: {}", fileName);return fileName;} catch (Exception e){log.error("文件上传失败: {}", e.getMessage(), e);throw new RuntimeException("文件上传失败", e);}}@Overridepublic String uploadFile(InputStream stream, String fileName, String contentType) {try{// 检查存储桶是否存在String bucketName = minioProperties.getBucketName();if (!bucketExists(bucketName)){makeBucket(bucketName);}// 上传文件 10MB 分片PutObjectArgs args = PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(stream, -1, 10485760).contentType(contentType).build();minioClient.putObject(args);log.info("文件上传成功: {}", fileName);return fileName;} catch (Exception e){log.error("文件上传失败: {}", e.getMessage(), e);throw new RuntimeException("文件上传失败", e);}}@Overridepublic String getObjectUrl(String objectName) {// 默认7天过期return getObjectUrl(objectName, 7 * 24 * 60 * 60);}@Overridepublic String getObjectUrl(String objectName, Integer expires) {try{GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(minioProperties.getBucketName()).object(objectName).expiry(expires).build();return minioClient.getPresignedObjectUrl(args);} catch (Exception e){log.error("获取文件URL失败: {}", e.getMessage(), e);throw new RuntimeException("获取文件URL失败", e);}}@Overridepublic boolean removeFile(String objectName) {return removeFile(minioProperties.getBucketName(), objectName);}@Overridepublic boolean removeFile(String bucketName, String objectName) {try{RemoveObjectArgs args = RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build();minioClient.removeObject(args);log.info("文件删除成功: {}", objectName);return true;} catch (Exception e){log.error("文件删除失败: {}", e.getMessage(), e);return false;}}@Overridepublic boolean bucketExists(String bucketName) {try{BucketExistsArgs args = BucketExistsArgs.builder().bucket(bucketName).build();return minioClient.bucketExists(args);} catch (Exception e){log.error("检查存储桶是否存在失败: {}", e.getMessage(), e);return false;}}@Overridepublic void makeBucket(String bucketName) {try{MakeBucketArgs args = MakeBucketArgs.builder().bucket(bucketName).build();minioClient.makeBucket(args);log.info("创建存储桶成功: {}", bucketName);} catch (Exception e){log.error("创建存储桶失败: {}", e.getMessage(), e);throw new RuntimeException("创建存储桶失败", e);}}
}
http://www.xdnf.cn/news/13938.html

相关文章:

  • 报表工具顶尖对决系列—关联过滤
  • [原创]X86C++反汇编03.除法的优化
  • 使用Nginx 如何解决Access-Control-Allow-Origin问题
  • 【大模型-写作】LLMxMapReduce-V2 自动修改大纲 生成高质量文章
  • 在macOS上运行Linux容器的方法
  • go-carbon v2.6.8 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
  • 【C/C++】创建文件夹
  • FreeRTOS事件组
  • Jetpack LiveData 深度解析
  • 什么是EcoVadis审核?EcoVadis审核的评估框架,EcoVadis审核流程
  • Odoo 企业版和社区版区别系列文章之一 日历模块 Calendar
  • 瑞利光测:桥梁结构健康监测解决方案,以光纤光栅技术筑牢安全防线
  • 小结:Spring AOP 切点表达式
  • 中国人工智能社区发展研究报告(2025)
  • MySQL 索引类型及其必要性与优点
  • 【QT】 QGraphicsItem 获取点坐标的几种方法
  • error report
  • 5种常见的网络保密通信协议
  • 【Linux】regmap子系统
  • 智慧工厂物联网解决方案:纺织厂边缘计算网关应用
  • 图像处理控件Aspose.Imaging教程:图像处理控件Aspose.Imaging教程:在Java中构建 SVG 图像调整器
  • vanna多表关联的实验
  • 将idea的目录结构以文本导出
  • MySQL 8.0的数据库root用户默认无法远程登录,需要修改root的远程授权
  • 使用AkShare获取大A列表
  • ( github actions + workflow 03 ) 手动添加 token, 防止权限不够
  • 运营商实名验证接口如何用Python实现调用?
  • 新疆大学具身导航新范式!DOPE:基于双重对象感知增强网络的视觉语言导航
  • golang -- map实现原理
  • 单片机队列功能模块的实战和应用