Minio文件储存解决方案JavaWeb篇

前言:本文为单体架构文件上传到Minio解决方案,工作中用到在这里记录一下

介绍

image
MinIO是对象存储服务。它基于Apache License 开源协议,兼容Amazon S3云存储接口。适合存储非结构化数据,如图片,音频,视频,日志等。对象文件最大可以达到5TB。
官网
http://www.minio.org.cn/

安装

本文不介绍安装,请读者按照官网提供方式,结合操作系统进行安装。

起步

1.0 引入坐标

<!--minio -->
<dependency>
	<groupId>io.minio</groupId>
	<artifactId>minio</artifactId>
	<version>8.3.3</version>
</dependency>
<!-- okHttp -->
<dependency>
	<groupId>com.squareup.okhttp3</groupId>
	<artifactId>okhttp</artifactId>
	<version>4.9.0</version>
</dependency>

Miniio配置

1.1 全局配置文件

minio:
  endpoint: 127.0.0.1
  port: 9000
  accessKey: minioadmin
  secretKey: minioadmin
  secure: false
  bucketName: "kdd-crm"
  configDir: "/data/excel"

读取配置

/**
 * @className: MinioConfig
 * @author Hope
 * @date 2020/7/28 13:43
 * @description: MinioConfig
 */
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {

    private final static String HTTP = "http://";

    //endPoint是一个URL,域名,IPv4或者IPv6地址
    private String endpoint;

    //TCP/IP端口号
    private int port;

    //accessKey类似于用户ID,用于唯一标识你的账户
    private String accessKey;

    //secretKey是你账户的密码
    private String secretKey;

    //如果是true,则用的是https而不是http,默认值是true
    private Boolean secure;

    //默认存储桶
    private String bucketName;
}

代码使用案例

controller层

    @PostMapping("/common/upload")
    public AjaxResult uploadFile(MultipartFile file){
        try{
            // 上传文件路径
            return fileService.upload(file);
        }catch (Exception e){
            return AjaxResult.error(e.getMessage());
        }
    }

service

/**
 * 获取Minio连接的方法
 * 获取Minio连接
 * @return
 */
//需要先注入
//MinioConfig minioConfig;
private MinioClient getClient(){
    MinioClient minioClient =
            MinioClient.builder()
                    .endpoint("http://"+minioConfig.getEndpoint()+":"+ minioConfig.getPort())
                    .credentials(minioConfig.getAccessKey(),minioConfig.getSecretKey())
                    .build();
    return minioClient;
}

上传方法

public AjaxResult upload(MultipartFile file) {
    InputStream inputStream = null;
    //创建Minio的连接对象
    MinioClient minioClient = getClient();
    //桶的名称
    String bucketName = minioConfig.getBucketName();
    try {
        inputStream = file.getInputStream();
        // 检查存储桶是否已经存在
        BucketExistsArgs bucket = BucketExistsArgs.builder().bucket(bucketName).build();
            boolean isExist = minioClient.bucketExists(bucket);
            if(!isExist)  {
                // 桶不存在就创建一个
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            }
        // 使用putObject上传一个文件到存储桶中。
        //格式需求 桶名称/年/月/日/uuid.pdf      桶名称/2022/08/30/uuid.pdf
        ///年/月/日/调时间工具类 datePath方法
        String datePath = DateUtils.datePath();
        String filename = UUID.randomUUID()+".pdf";
        minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(bucketName)
                        .object(datePath+ "/" + filename).stream(inputStream, inputStream.available(), -1)
                        .build());
        inputStream.close();
        /**
         * 构建返回结果集
         */
        AjaxResult ajax = AjaxResult.success();
        /**
         * 封装需要的数据进行返回
		 * 这里可以用put封装返回给前端是数据
         */
        return ajax;
    }catch(Exception e){
        e.printStackTrace();
        return AjaxResult.error("上传失败");
    }finally {
        //防止内存泄漏
        if (inputStream != null) {
            try {
                inputStream.close(); // 关闭流
            } catch (IOException e) {
                log.debug("inputStream close IOException:" + e.getMessage());
            }
        }
    }
}

public Builder stream(InputStream stream, long objectSize, long partSize)方法参数介绍
官方注释

设置要上载的流。提供对象/零件尺寸的两种方法。
如果对象大小未知,将-1传递给objectSize并传递有效的partSize。
如果对象大小已知,将-1传递到partSize以进行自动检测;否则,传递有效的partSize以控制内存使用和上传中的零件数量。 如果partSize大于objectSize,则objectSize用作partSize。
有效零件尺寸介于5MiB到5GiB之间(包括两个极限)。


所以我们这里设置partSize为-1
获取路径也是很简单的
"http://" + minioConfig.getEndpoint() + ":" + minioConfig.getPort() + "/" + bucketName +"/"+ datePath + "/" + filename

有什么不妥的地方欢迎大家和我讨论,谢谢

posted @ 2022-08-30 20:49  小源博客  阅读(1331)  评论(0编辑  收藏  举报