对象存储服务MinIO快速入门(集成项目的详细过程)

 更新时间:2025年03月10日 09:56:41   作者:二本也有大厂梦  
MinIO是一个开源的对象存储服务,支持多种操作系统,配置简单且性能高,它使用纠删码进行数据保护,可以容忍硬件故障,MinIO支持多种语言的SDK和丰富的API,本文介绍对象存储服务MinIO快速入门,感兴趣的朋友一起看看吧

对象存储服务MinIO

MinIO简介

MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。

MinIO特点

  • 数据保护

Minio使用Minio Erasure Code(纠删码)来防止硬件故障。即便损坏一半以上的driver,但是仍然可以从中恢复。

  • 高性能

作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GB/s的写速率

  • 可扩容

不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心

  • SDK支持

基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持

  • 有操作页面

面向用户友好的简单操作界面,非常方便的管理Bucket及里面的文件资源

  • 功能简单

这一设计原则让MinIO不容易出错、更快启动

  • 丰富的API

支持文件资源的分享连接及分享链接的过期策略、存储桶操作、文件列表访问及文件上传下载的基本功能等。

  • 文件变化主动通知

存储桶(Bucket)如果发生改变,比如上传对象和删除对象,可以使用存储桶事件通知机制进行监控,并通过以下方式发布出去:AMQP、MQTT、Elasticsearch、Redis、NATS、MySQL、Kafka、Webhooks等。

一、安装启动

我采用的是docker安装

docker pull minio/minio

创建配置文件目录和上传目录

mkdir -p /home/minio/configmkdir -p /home/minio/data

启动容器

docker run -p 9000:9000 -p 9090:9090 \
     --net=host \
     --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=admin" \
     -e "MINIO_SECRET_KEY=admin123456" \
     -v /home/minio/data:/data \
     -v /home/minio/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9090" -address ":9000"

假设我们的服务器地址为http://192.168.200.100:9000,我们在地址栏输入:http://http://192.168.200.100:9000/ 即可进入登录界面。

Access Key为admin ,Secret_key 为admin123456进入系统后可以看到主界面

一、快速入门

创建springboot项目

1 导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>7.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

在配置文件中导入

minio:
  accessKey: admin
  secretKey: admin123456
  bucket: text
  endpoint: http://192.168.200.100:9000
  readPath: http://192.168.200.100:9000

2 配置类

MinIOProperties

@Configuration
@Data
@ConfigurationProperties(prefix = "minio")
public class MinIOProperties {
    private String accessKey;
    private String secretKey;
    private String bucket;
    private String endpoint;
    private String readPath;
}

MinIOClientConfig

@Data
@Primary
@Configuration
public class MinIOClientConfig {
   @Autowired
   private MinIOProperties minIOProperties;
    @Bean
    public MinioClient buildMinioClient(){
        return MinioClient
                .builder()
                .credentials(minIOProperties.getAccessKey(), minIOProperties.getSecretKey())
                .endpoint(minIOProperties.getEndpoint())
                .build();
    }
}

3 开始业务

Controller

@RestController
@RequestMapping("minio")
public class UploadController {
    @Autowired
    private FileService fileService;
    @PostMapping("/upload")
    public String uploadMinio(@RequestPart("file") MultipartFile file) {
        return fileService.uploadMinio(file);
    }
}

Service

public interface FileService {
    public String uploadMinio(MultipartFile file) ;
}

ServiceImpl

@Slf4j
@Service
public class FileServiceImpl implements FileService {
    @Autowired
    private MinioClient minioClient;
    @Autowired
    private MinIOProperties minioProperties;
    @Override
    public String uploadMinio(MultipartFile file) {
        System.out.println(minioProperties);
        try {
            // 判断桶是否存在
            boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioProperties.getBucket()).build());
            if (!found) {       // 如果不存在,那么此时就创建一个新的桶
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucket()).build());
            } else {  // 如果存在打印信息
                System.out.println("Bucket 'daijia' already exists.");
            }
            // 设置存储对象名称
            String extFileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            String fileName = new SimpleDateFormat("yyyyMMdd")
                    .format(new Date()) + "/" + UUID.randomUUID().toString().replace("-" , "") + "." + extFileName;
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .bucket(minioProperties.getBucket())
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .object(fileName)
                    .build();
            minioClient.putObject(putObjectArgs) ;
            return minioProperties.getEndpoint() + "/" + minioProperties.getBucket() + "/" + fileName ;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "error";
    }
}

4 测试

点击连接,就可以开始下载图片

如果发现图片报错,去控制台把Access Policy 改成Pubilc

完成。

不用web的方式也可以上传图片:

Service

public interface FileStorageService {
    /**
     *  上传图片文件
     * @param prefix  文件前缀
     * @param filename  文件名
     * @param inputStream 文件流
     * @return  文件全路径
     */
    public String uploadImgFile(String prefix, String filename,InputStream inputStream);
  	/**
     * 删除文件
     * @param pathUrl  文件全路径
     */
    public void delete(String pathUrl);
}

ServiceImpl

@Slf4j
@Service
public class MinIOFileStorageServiceImpl implements FileStorageService {
    @Autowired
    private MinioClient minioClient;
    @Autowired
    private MinIOProperties minIOConfigProperties;
    private final static String separator = "/";
    /**
     *  上传图片文件
     * @param prefix  文件前缀
     * @param filename  文件名
     * @param inputStream 文件流
     * @return  文件全路径
     */
    @Override
    public String uploadImgFile(String prefix, String filename, InputStream inputStream) {
        String filePath = builderFilePath(prefix, filename);
        try {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object(filePath)
                    .contentType("image/jpg")
                    .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)
                    .build();
            minioClient.putObject(putObjectArgs);
            StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
            urlPath.append(separator+minIOConfigProperties.getBucket());
            urlPath.append(separator);
            urlPath.append(filePath);
            return urlPath.toString();
        }catch (Exception ex){
            log.error("minio put file error.",ex);
            throw new RuntimeException("上传文件失败");
        }
    }
    /**
     * 删除文件
     * @param pathUrl  文件全路径
     */
    @Override
    public void delete(String pathUrl) {
        String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");
        int index = key.indexOf(separator);
        String bucket = key.substring(0,index);
        String filePath = key.substring(index+1);
        // 删除Objects
        RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
        try {
            minioClient.removeObject(removeObjectArgs);
        } catch (Exception e) {
            log.error("minio remove file error.  pathUrl:{}",pathUrl);
            e.printStackTrace();
        }
    }
}

测试类:

@SpringBootTest
class MinioDemoApplicationTests {
    @Autowired
   private MinIOFileStorageServiceImpl minIOFileStorageServiceImpl;
    @Test
    void imageFileStorage() throws IOException {
        String fileName = UUID.randomUUID().toString().replaceAll("-", "");
        String path = minIOFileStorageServiceImpl.uploadImgFile("text", fileName, Files.newInputStream(new File("D:\\图片\\1.jpg").toPath()));
        System.out.println(path);
    }
    @Test
    void deleteImageFile() throws IOException {
        minIOFileStorageServiceImpl.delete("");//这里填上传的文件路径
    }
}

完成。

到此这篇关于对象存储服务MinIO快速入门(集成项目的详细过程)的文章就介绍到这了,更多相关对象存储服务MinIO内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 整合MyBatis+MyBatis-Plus+MyBatisX插件使用

    SpringBoot 整合MyBatis+MyBatis-Plus+MyBatisX插件使用

    本文主要介绍了SpringBoot 整合MyBatis+MyBatis-Plus+MyBatisX插件使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • 引入QQ邮箱发送验证码进行安全校验功能实现

    引入QQ邮箱发送验证码进行安全校验功能实现

    最近遇到这样的需求用户输入自己的邮箱,点击获取验证码,后台会发送一封邮件到对应邮箱中,怎么实现呢?下面小编给大家带来了引入QQ邮箱发送验证码进行安全校验功能,需要的朋友可以参考下
    2023-02-02
  • Java聊天室之实现聊天室服务端功能

    Java聊天室之实现聊天室服务端功能

    这篇文章主要为大家详细介绍了Java简易聊天室之实现聊天室服务端功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-10-10
  • struts2中实现多个文件同时上传代码

    struts2中实现多个文件同时上传代码

    struts2中实现多个文件同时上传代码,需要的朋友可以参考一下
    2013-04-04
  • Java并发Lock接口实现示例详解

    Java并发Lock接口实现示例详解

    这篇文章主要为大家介绍了Java并发Lock接口,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • java+MongoDB实现存图片、下载图片的方法示例

    java+MongoDB实现存图片、下载图片的方法示例

    这篇文章主要介绍了java+MongoDB实现存图片、下载图片的方法,结合实例形式详细分析了java结合MongoDB实现图片的存储与下载相关操作技巧,需要的朋友可以参考下
    2019-09-09
  • MyBatis中使用$和#所遇到的问题及解决办法

    MyBatis中使用$和#所遇到的问题及解决办法

    这篇文章主要介绍了MyBatis中使用$和#所遇到的问题及解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • Java面向对象特性详解之封装篇

    Java面向对象特性详解之封装篇

    Java是一种广泛使用的面向对象编程语言,它支持封装、继承和多态等核心概念,这些都是面向对象编程范式的重要组成部分,这篇文章主要介绍了Java面向对象特性详解之封装篇的相关资料,需要的朋友可以参考下
    2025-12-12
  • 从log4j切换到logback后项目无法启动的问题及解决方法

    从log4j切换到logback后项目无法启动的问题及解决方法

    这篇文章主要介绍了从log4j切换到logback后项目无法启动的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 深入了解Java File对象的使用

    深入了解Java File对象的使用

    这篇文章主要为大家详细介绍了Java中File对象的使用的相关资料,文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
    2022-11-11

最新评论