首页 > 其他分享 >在Spring Boot应用中配置和使用MinIO

在Spring Boot应用中配置和使用MinIO

时间:2024-08-10 23:39:12浏览次数:13  
标签:MinIO Spring Boot springframework file import properties String

要在Spring Boot项目中使用MinIO作为对象存储服务,可以使用MinIO的Java SDK来与MinIO进行交互。以下是如何在Spring Boot应用中配置和使用MinIO的详细步骤:

1. 添加MinIO依赖

首先,你需要在项目中添加MinIO的Java SDK依赖。如果使用的是Maven,添加以下依赖到pom.xml中:

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.2.0</version> <!-- 使用最新的稳定版本 -->
</dependency>

如果使用的是Gradle,添加以下依赖到build.gradle中:

implementation 'io.minio:minio:8.2.0' // 使用最新的稳定版本

2. 配置MinIO客户端

可以通过Spring Boot的配置文件application.propertiesapplication.yml来配置MinIO客户端的连接信息。

示例:application.yml

spring:
  # 文件上传
  servlet:
    multipart:
      # 单个文件大小
      max-file-size: 10MB
      # 设置总上传的文件大小
      max-request-size: 20MB

minio:
  endpoint: http://localhost:9000  # MinIO服务器的URL
  access-key: minioadmin      # 访问密钥
  secret-key: minioadmin      # 密钥密码
  bucket-name: works     # 默认的Bucket名称
  secure: false          # 是否使用HTTPS(如果使用HTTPS,请设置为true)

3. 创建MinIO配置类

接下来,创建一个配置类来初始化MinIO客户端,并将其作为Spring Bean进行管理。

MinIO配置类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "minio")
@Data
public class MinioProperties {

    private String endpoint;

    private String accessKey;

    private String secretKey;

    private String bucketName;

    private String secure;
}
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfiguration {

    @Autowired
    private MinioProperties properties;

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder().endpoint(properties.getEndpoint()).credentials(properties.getAccessKey(), properties.getSecretKey()).build();
    }

}

4. 使用MinIO客户端

现在你可以在你的服务或控制器中使用MinIO客户端来执行各种操作,例如上传、下载、列举对象等。

接口类

import io.minio.errors.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public interface FileService {

    String upload(MultipartFile file) throws ServerException,
            InsufficientDataException, ErrorResponseException,
            IOException, NoSuchAlgorithmException, InvalidKeyException,
            InvalidResponseException, XmlParserException, InternalException;
}

实现类

import com.echo.common.minio.MinioProperties;
import com.echo.webapp.file.service.FileService;
import io.minio.*;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {
    @Autowired
    private MinioProperties properties;

    @Autowired
    private MinioClient minioClient;

    @Override
    public String upload(MultipartFile file) throws ServerException,
            InsufficientDataException, ErrorResponseException, IOException,
            NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException,
            XmlParserException, InternalException {

        boolean bucketExists = minioClient.bucketExists(
                BucketExistsArgs.builder()
                        .bucket(properties.getBucketName())
                        .build());
        if (!bucketExists) {
            minioClient.makeBucket(
                    MakeBucketArgs.builder()
                            .bucket(properties.getBucketName())
                            .build());
            minioClient.setBucketPolicy(
                    SetBucketPolicyArgs.builder()
                            .bucket(properties.getBucketName())
                            .config(createBucketPolicyConfig(properties.getBucketName()))
                            .build());
        }
        String filename = new SimpleDateFormat("yyyyMMdd").format(new Date()) +
                "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();
        minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(properties.getBucketName())
                        .stream(file.getInputStream(), file.getSize(), -1)
                        .object(filename)
                        .contentType(file.getContentType())
                        .build());

        return String.join("/", properties.getEndpoint(), properties.getBucketName(), filename);
    }

    private String createBucketPolicyConfig(String bucketName) {

        return """
                {
                  "Statement" : [ {
                    "Action" : "s3:GetObject",
                    "Effect" : "Allow",
                    "Principal" : "*",
                    "Resource" : "arn:aws:s3:::%s/*"
                  } ],
                  "Version" : "2012-10-17"
                }
                """.formatted(bucketName);
    }
}

控制类

import com.echo.common.result.Result;
import com.echo.webapp.file.service.FileService;
import io.minio.errors.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;


@Tag(name = "文件管理")
@RequestMapping("/app/file")
@RestController
public class FileUploadController {
    @Autowired
    private FileService fileService;

    @Operation(summary = "上传文件")
    @PostMapping("upload")
    public Result<String> upload(@RequestPart MultipartFile file) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        String url = fileService.upload(file);
        return Result.ok(url);
    }

}


标签:MinIO,Spring,Boot,springframework,file,import,properties,String
From: https://www.cnblogs.com/echohye/p/18352953

相关文章

  • springboot集成Apollo
    ​目前市面上用的比较多的配置中心有:1.Nacos/Apollo对此Nacos Apollo灰度发布 不支持 支持IP级别的灰度发布权限管理 不支持 基本完善版本管理&回滚 支持 之前回滚上一个版本配置实时推送(动态刷新) 支持,但对加密数据有bug存在基本完善敏感加密 引入Jasypt 引入Jasypt......
  • springboot自定义枚举转换器
    在Spring框架中,枚举类型的转换可以通过自定义的转换器来实现,这样可以方便地在请求参数、表单数据、以及数据库查询中使用枚举类型。下面是关于Spring枚举转换器的详细介绍和使用方法:以排序枚举为例1.定义枚举类BaseEnum.javapackagecom.echo.model.enums;publicinterfa......
  • 基于Spring Cloud的微服务架构设计与实践
    基于SpringCloud的微服务架构设计与实践大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!SpringCloud是一个为构建分布式系统提供全套解决方案的框架,它通过一系列组件和工具,简化了微服务架构的实现过程。本文将详细介绍如何基于SpringCloud进行微......
  • Spring Framework BeanUtils的使用
    SpringFramework的BeanUtils是一个用于简化JavaBean操作的工具类。它主要提供了以下功能:属性拷贝:BeanUtils可以将一个JavaBean的属性值拷贝到另一个JavaBean中。这对于需要将对象间的属性进行快速复制时特别有用。常用的方法是copyProperties,它可以从源对象复......
  • Spring Boot:开启Java开发的新篇章
    引言随着互联网技术的飞速发展,业务需求变化日益频繁,对开发效率提出了更高要求。传统的Java应用构建过程往往繁琐复杂,涉及到大量的配置文件编写与依赖管理等工作。SpringBoot正是针对这一痛点而生,它通过约定优于配置的原则,简化了Spring应用的搭建过程,使得开发者可以更加专......
  • springboot框架的基本构建
    SpringBoot是一个用于简化Spring应用初始搭建以及开发过程的框架。它通过提供默认配置和约定优于配置的原则,让开发者能够快速启动和运行项目。本文将介绍SpringBoot的基础配置,帮助你快速上手并理解其核心概念。##环境准备在开始之前,确保你的开发环境已经准备就绪。你......
  • 基于Springboot+Vue的学院网站系统 (含源码数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:SpringBoot自带apachetomcat主要技术:Java,Springboot,mybatis,mysql,vue2.视频演示地址3.功能这个系......
  • springboot+vue社区医疗服务管理系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着社会老龄化进程的加速和居民健康意识的不断提升,社区医疗服务作为公共卫生体系的重要一环,其重要性日益凸显。然而,传统社区医疗服务管理面临着信息孤岛、效率低下、资源分配不均等问题,难以满足居民日益增长的健康服务需求。特别是在......
  • 【Spring-RabbitMq】设置消费重试次数
    引言在我们实际项目中需要对消息消费的高可用做保证,首先需要做到的就是消息的重试机制,设想一下以下场景:当库存服务处理上游服务发过来的订单消息时,此时服务宕机了,或者网络不可用了,那我这个消息是应该算消费成功还是消费失败呢?显然,我们肯定要对处理不成功的消息进行重试......
  • springboot+vue社区物品交换平台的管理与实现【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着社会的快速发展和物质生活的日益丰富,社区居民之间物品闲置与浪费现象日益凸显。一方面,许多家庭拥有大量不再使用但仍具使用价值的物品;另一方面,这些物品对于其他家庭而言可能正是所需。在此背景下,构建一个社区物品交换平台显得尤为......