springboot minio分布式文件系统

官网下载minio

《minio官网》
在这里插入图片描述

我下载的是windows的

创个目录存放minio.exe,后续创建的文件夹都是在存放exe文件夹里的了。

访问IP:9000

minioadmin

springboot

pom.xml

建议7.1.0,每个版本之间改动很大

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

application.yml

minio:
  endpoint: http://127.0.0.1
  port: 9000
  secure: false
  accessKey: minioadmin
  secretKey: minioadmin

MinioConfig.java

配置文件

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

@Configuration
public class MinioConfig {
    @Value("${minio.endpoint}")
    private String endpoint;//url
    @Value("${minio.port}")
    private int port;//端口号
    @Value("${minio.secure}")
    private boolean secure;//https?true:false
    @Value("${minio.accessKey}")
    private String accessKey;//账号
    @Value("${minio.secretKey}")
    private String secretKey;//密码

    @Bean
    public MinioClient getMinioClient(){
        return MinioClient.builder().endpoint(endpoint, port, secure).credentials(accessKey, secretKey).build();
    }
}

MinioUtil.java

工具类

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

import javax.annotation.Resource;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

@Component
public class MinioUtil {
    @Resource
    MinioConfig minioConfig;

    /**
     * 文件上传
     *
     * @param multipartFile 文件
     */
    public String upload(MultipartFile multipartFile) throws InvalidBucketNameException, InsufficientDataException, IOException, NoSuchAlgorithmException, InvalidPortException, InvalidKeyException, InvalidEndpointException, XmlParserException, InternalException, RegionConflictException, ErrorResponseException, InvalidResponseException, ServerException {
        PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
        putObjectOptions.setContentType(multipartFile.getContentType());
        DateTimeFormatter yyyy = DateTimeFormatter.ofPattern("yyyy");
        DateTimeFormatter MM = DateTimeFormatter.ofPattern("MM");
        DateTimeFormatter dd = DateTimeFormatter.ofPattern("dd");
        LocalDate localDate = LocalDate.now();//获取当前时间
        String bucketName = localDate.format(yyyy);//以年为存储桶
        String path = localDate.format(MM) + "/" + localDate.format(dd) + "/";//在年存储桶里面创建月日文件夹
        boolean bucketExists = minioConfig.getMinioClient().bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (!bucketExists) {//判断存储桶yyyy是否存在,不存在则创建
            minioConfig.getMinioClient().makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            //设置读写权限
            String read_write = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "/*\"]}]}";
            minioConfig.getMinioClient().setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(read_write).build());
        }
        //更换文件名称
        String originalFilename = multipartFile.getOriginalFilename();
        assert originalFilename != null;
        String fileName = path + UUID.randomUUID().toString().replaceAll("-", "") + originalFilename.substring(originalFilename.lastIndexOf("."));
        minioConfig.getMinioClient().putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
                        multipartFile.getInputStream(), multipartFile.getSize(), -1)
                .contentType(multipartFile.getContentType())
                .build());
        return bucketName + "/" + fileName;
    }

    /**
     * 文件删除
     *
     * @param bucketName 存储桶名称
     * @param fileName   文件名称
     */
    public void delete(String bucketName, String fileName) throws InvalidPortException, InvalidEndpointException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {
        minioConfig.getMinioClient().removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
    }
}

MinioController.java

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

import javax.annotation.Resource;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

@RestController
@RequestMapping("minio")
public class MinioController {
    @Resource
    private MinioUtil minioUtil;

    /**
     * 文件上传
     * @param file 文件
     */
    @PostMapping("upload")
    public String upload(@RequestParam("file") MultipartFile file) throws InvalidBucketNameException, InsufficientDataException, IOException, NoSuchAlgorithmException, InvalidPortException, InvalidKeyException, InvalidEndpointException, XmlParserException, InternalException, RegionConflictException, ErrorResponseException, InvalidResponseException, ServerException {
        return minioUtil.upload(file);
    }

    /**
     * 删除文件
     * @param bucketName 存储桶名称
     * @param fileName 文件名称
     */
    @DeleteMapping("delete")
    public void delete(@RequestParam("bucketName") String bucketName,@RequestParam("fileName") String fileName) throws InvalidBucketNameException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidPortException, InvalidKeyException, InvalidEndpointException, InvalidResponseException, XmlParserException, InternalException, ServerException {
        minioUtil.delete(bucketName, fileName);
    }
}

postman测试

上传

在这里插入图片描述
在这里插入图片描述

删除

在这里插入图片描述
在这里插入图片描述

查看图片是通过9000端口去查看,不是50000端口

50000端口是管理图片。
在这里插入图片描述


版权声明:本文为weixin_43933728原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。