MinIO文件上传

目录

一、配置文件

二、定义调用信息

1、定义MinioProperties类

2、定义MinioConfiguratio类

三、定义接口

四、上传文件业务逻辑


一、配置文件

在application.yml中配置信息

minio:
  endpoint: http://<hostname>:<port>
  access-key: <access-key>
  secret-key: <secret-key>
  bucket-name: <bucket-name>

二、定义调用信息

1、定义MinioProperties类

@ConfigurationProperties(prefix = "minio")
@Data
public class MinioProperties {
    private String endpoint;
    private String accessKey;
    private String secretKey;
    private String bucketName;

}

2、定义MinioConfiguratio类

配置和创建一个Minio客户端的Spring配置类。以下是该代码的用途和使用方法的详细描述:

  1. 配置类声明:

    • @Configuration: 这个注解表示MinioConfiguration类是一个配置类,Spring容器在启动时会读取这个类中的配置信息。
  2. 启用配置属性:

    • @EnableConfigurationProperties(MinioProperties.class): 这个注解启用了对MinioProperties类的支持,这样就可以将配置文件(如application.properties或application.yml)中的属性自动绑定到MinioProperties对象上。
  3. 属性注入:

    • @Autowired: 通过这个注解,MinioProperties类的实例被自动注入到MinioConfiguration类中。MinioProperties类应该包含与Minio服务相关的配置属性,如端点URL、访问密钥和秘密密钥。
  4. 创建Minio客户端Bean:

    • @Bean: 这个注解定义了一个Bean,minioClient方法返回一个MinioClient对象。Spring容器会管理这个Bean的生命周期,并在需要时将其注入到其他Bean中。
// 声明这是一个配置类
@Configuration
// 启用配置属性,这里指的是MinioProperties
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfiguration {

    // 自动注入Minio属性配置
    @Autowired
    private MinioProperties properties;

    // 定义一个Bean,用于创建Minio客户端实例
    @Bean
    public MinioClient minioClient() {
        // 使用MinioClient的构建器模式来创建客户端实例
        return MinioClient
                .builder()
                // 设置Minio服务的端点URL
                .endpoint(properties.getEndpoint())
                // 设置访问Minio服务的认证信息
                .credentials(properties.getAccessKey(), properties.getSecretKey())
                // 构建并返回MinioClient实例
                .build();
    }
}

三、定义接口

返回文件的URL,字符串类型



@Tag(name = "文件管理")
@RequestMapping("/admin/file")
@RestController
public class FileUploadController {

    @Autowired
    private FileService fileService;

    @Operation(summary = "上传文件")
    @PostMapping("upload")
    public Result<String> upload(@RequestParam MultipartFile file) {


        String url = fileService.upload(file);
        System.out.println(url);

        return Result.ok(url);
    }

}

四、上传文件业务逻辑

  1. 类声明和注解:

    • @Service: 这个注解告诉Spring框架,这个类是一个服务组件,它将被注册为一个Spring Bean,可以在Spring容器中被其他组件注入和使用。
  2. 成员变量:

    • minioClient: 注入的 MinioClient 对象,用于与Minio对象存储服务进行交互。
    • minioProperties: 注入的 MinioProperties 对象,包含Minio服务的配置信息,如端点、存储桶名称等。
  3. upload方法:

    • 用途: 实现了 FileService 接口的 upload 方法,用于将客户端上传的文件保存到Minio对象存储服务中。
    • 逻辑:
      • 检查配置中指定的存储桶是否存在,如果不存在,则创建它。
      • 如果存储桶不存在,还会设置一个策略,允许任何人读取存储桶中的对象。
      • 构建一个唯一的文件名,使用当前日期和UUID,然后上传文件到Minio存储桶。
      • 如果上传成功,返回文件的访问路径,否则返回null。
  4. bucketExists方法:

    • 用途: 检查Minio中是否存在指定的存储桶。
  5. makeBucket方法:

    • 用途: 如果存储桶不存在,创建一个新的存储桶。
  6. setBucketPolicy方法:

    • 用途: 为存储桶设置策略,这里设置为允许任何人读取存储桶中的对象。
  7. putObject方法:

    • 用途: 将文件上传到Minio存储桶中,需要指定存储桶名称、对象名称(文件名)、文件输入流和文件大小以及文件类型。
  8. createBucketPolicyConfig方法:

    • 用途: 创建一个JSON格式的字符串,包含存储桶策略的配置信息,允许匿名用户读取存储桶中的对象。

// 表示该类是一个服务组件,用于实现文件上传功能
@Service
public class FileServiceImpl implements FileService {

    // 自动注入MinioClient,用于操作Minio对象存储服务
    @Autowired
    private MinioClient minioClient;
    // 自动注入Minio配置属性,用于获取Minio服务的相关配置信息
    @Autowired
    private MinioProperties minioProperties;

    // 实现FileService接口的upload方法,用于上传文件
    @Override
    public String upload(MultipartFile file) {
        try {
            // 检查指定的存储桶是否存在
            boolean bucketExists = minioClient.
                    bucketExists(BucketExistsArgs.builder().
                            bucket(minioProperties.getBucketName()). // 指定存储桶名称
                            build());
            // 如果存储桶不存在,则创建存储桶
            if (!bucketExists) {
                minioClient
                        .makeBucket(MakeBucketArgs.builder()
                                .bucket(minioProperties.getBucketName()) // 指定存储桶名称
                                .build());
                // 设置存储桶策略,允许匿名用户读取对象
                minioClient.
                        setBucketPolicy(SetBucketPolicyArgs.
                                builder().
                                bucket(minioProperties.getBucketName()). // 指定存储桶名称
                                config(createBucketPolicyConfig(minioProperties.getBucketName())). // 指定存储桶策略配置
                                build());
            }

            // 构建文件名,包含日期和UUID,确保文件名的唯一性
            String filename = new SimpleDateFormat("yyyyMMdd").format(new Date()) + "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();
            // 上传文件到Minio存储桶
            minioClient.putObject(PutObjectArgs.builder().
                    bucket(minioProperties.getBucketName()). // 指定存储桶名称
                    object(filename). // 指定对象名称(文件名)
                    stream(file.getInputStream(), file.getSize(), -1). // 指定文件输入流和大小
                    contentType(file.getContentType()). // 指定文件类型
                    build());

            // 返回文件的访问路径
            return String.join("/", minioProperties.getEndpoint(), minioProperties.getBucketName(), filename);

        } catch (Exception e) {
            // 打印异常堆栈信息
            e.printStackTrace();
        }

        // 如果上传失败,返回null
        return null;
    }

    // 创建存储桶策略配置,允许匿名用户读取存储桶中的对象
    private String createBucketPolicyConfig(String bucketName) {
        // 使用String.format方法格式化存储桶策略配置字符串
        return """
            {
              "Statement" : [ {
                "Action" : "s3:GetObject",
                "Effect" : "Allow",
                "Principal" : "*",
                "Resource" : "arn:aws:s3:::%s/*"
              } ],
              "Version" : "2024-8-12"
            }
            """.formatted(bucketName);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依恋、阳光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值