自学内容网 自学内容网

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:9000
  accesskey: admin
  secretKey: xxxx
  bucketName: work
  connectTimeout: 60000
  writeTimeout: 60000
  readTimeout: 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;

    @Bean
    public 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 {

    @Autowired
    private  MinioClient minioClient;
    @Autowired
    private  MinioProperties minioProperties;

    @Override
    public String uploadFile(MultipartFile file) {
        return uploadFile(file, minioProperties.getBucketName());
    }

    @Override
    public 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);
        }
    }

    @Override
    public 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);
        }
    }

    @Override
    public 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);
        }
    }

    @Override
    public 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);
        }
    }

    @Override
    public String getObjectUrl(String objectName) {
        // 默认7天过期
        return getObjectUrl(objectName, 7 * 24 * 60 * 60);
    }

    @Override
    public 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);
        }
    }

    @Override
    public boolean removeFile(String objectName) {
        return removeFile(minioProperties.getBucketName(), objectName);
    }

    @Override
    public 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;
        }
    }

    @Override
    public 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;
        }
    }

    @Override
    public 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);
        }
    }
}


原文地址:https://blog.csdn.net/weixin_42456784/article/details/148606220

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!