springboot 配置minio 保存图片

一、注入依赖

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.17</version>
</dependency>

二、创建配置类(配合yaml注入)

package com.wt.lease.common.minio;

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MinioConfiguration {
    @Autowired
    private MinioProperties minioProperties;

    // minio 客户端
    @Bean
    public MinioClient minioClient(){
        MinioClient build = MinioClient.builder()
                .endpoint(minioProperties.getEndpoint())
                .credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())
                .build();
        return build;
    }

}

三、使用

package com.wt.lease.web.admin.service.impl;

import com.wt.lease.common.minio.MinioProperties;
import com.wt.lease.web.admin.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 minioProperties;
    @Autowired
    private MinioClient minioClient;

    @Override
    public String upload(MultipartFile file) throws 
            ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, 
            InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        // 判断是否存在
        boolean exists = minioClient.bucketExists(
                BucketExistsArgs.builder().bucket(minioProperties.getBucketName()).build()
        );
        if (!exists){
            // 创建桶
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(minioProperties.getBucketName())
                    .build());
            // 设置权限
            minioClient.setBucketPolicy(
                    SetBucketPolicyArgs.builder()
                            .bucket(minioProperties.getBucketName())
                            .config(createBucketPolicy(minioProperties.getBucketName()))
                            .build()
            );

        }
        // 获取文件名
        String filename = new SimpleDateFormat("yyyyMMdd").format(new Date()) +
                "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();
        // 上传文件
        minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(minioProperties.getBucketName())
                        .stream(file.getInputStream(), file.getSize(), -1)
                        .object(filename)
                        .contentType(file.getContentType())
                        .build()
        );
        return String.join("/", minioProperties.getEndpoint(), minioProperties.getBucketName(), filename);
    }

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

 

posted @ 2025-05-11 23:09  市丸银  阅读(36)  评论(0)    收藏  举报