一、概述
1.1什么是MinIO?
- MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用,它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
  官网:https://min.io
  中文:https://www.minio.org.cn/,http://docs.minio.org.cn/docs/
1.2常见的数据存储
MinIO存储基于对象存储(Object Storage)是一种数据存储架构,它以对象为单位来处理、存储和检索数据,每个对象都包含了数据本身以及元数据;
MinIO存储的元数据主要包括对象的描述信息,如用户(account)、存储桶(bucket)以及存储桶索引(bucket index)等;
文本数据:新闻报道、社交媒体文章、博客......
语音数据:音频形式存储的数据,语音
mp3文件...... 图像数据:各种图片......
视频数据:各种视频、电影......
非结构化数据:没有明确结构的数据,比如社交评论、日志文件......
1.3docker部署
docker run -p 9000:9000 -p 9001:9001 \
     --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=minioadmin" \
     -e "MINIO_SECRET_KEY=minioadmin" \
     -e "MINIO_SERVER_URL=http://服务器ip:9000"
     -v /home/minio/data:/data \
     -v /home/minio/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9001" -address ":9000"Minio(官方docker版)容器部署时区问题
解决方案https://blog.csdn.net/yang2330648064/article/details/138453712
1.4页面访问操作
登录
访问:http://192.168.124.132:9090/login 用户名:密码 minioadmin:minioadmin

创建用户


创建组


创建accessKey和secretKey


点击下载
文件内容如下,保存文件,SDK操作文件的API需要用到
{"url":"http://192.168.124.132:9000","accessKey":"XO1JDovW2FTmGaBb","secretKey":"uG6wMfylUnOVH5WzwxqnldOWw2dMshNX","api":"s3v4","path":"auto"}创建Bucket



上传文件


二、springboot整合MinIO
官方文档:https://min.io/docs/minio/linux/developers/minio-drivers.html
Java快速指南 — MinIO中文文档 | MinIO Linux中文文档
2.1maven配置
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.9</version>
</dependency>
2.2写配置
@Component
public class MinioConfig {
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint("http://ip:9000")
                .credentials("minioadmin", "minioadmin")
                .build();
    }
}2.3MInIO常见API
MinIO中的Bucket、Object
Bucket 是存储Object的逻辑空间,每个Bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;
Object 是存储到MinIO的基本对象,对用户而言,相当于文件;
桶操作
- bucketExists() 用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在
- makeBucket() 用于创建一个新的存储桶(bucket),需要指定存储桶的名称;
- listBuckets() 用于列出用户有权访问的所有存储桶,返回存储桶的列表;
- removeBucket() 用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;
 @Autowired
    private MinioClient minioClient;
    @Test
    void contextLoads() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        System.out.println(minioClient);
        if(!minioClient.bucketExists(BucketExistsArgs.builder().bucket("lab-test").build())){
            System.out.println("不存在创建bucket");
            minioClient.makeBucket(MakeBucketArgs.builder().bucket("lab-test").build());
        }
        System.out.println(minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build()));
        System.out.println(minioClient.listBuckets());
        minioClient.removeBucket(RemoveBucketArgs.builder().bucket("test").build());
    }文件操作
- putObject():用于上传文件到指定的存储桶;
- statObject():用于检查指定的对象(文件)的状态;
- getPresignedObjectUrl():用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问;
- getObject():用于从指定的存储桶中下载文件;
- listObjects():用于列出指定存储桶中的所有对象(文件);
- removeObject():用于删除指定存储桶中的对象,需要指定存储桶名称和对象键;

@Test
    void testFile() throws Exception {
//        上传文件
        File file = new File("D:\\workspace-java\\lab-test\\files\\1716776437448-1.jpg");
        ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder()
                .bucket("lab-test")
                .object("test.jpg")
                .stream(new FileInputStream(file), file.length(), -1)
                .build()
        );
        System.out.println(objectWriteResponse);
        ObjectWriteResponse objectWriteResponse2 = minioClient.uploadObject(UploadObjectArgs.builder()
                .bucket("lab-test")
                .object("test2.jpg")
                .filename("D:\\workspace-java\\lab-test\\files\\1716776437448-1.jpg")
                .build()
        );
      //        检查指定的对象(文件)的状态
      try {
          boolean isObjectExist = minioClient.statObject(StatObjectArgs.builder()
                  .bucket("lab-test")
                  .object("test3.jpg")
                  .build()
          ) != null;
          System.out.println("文件存在");
      }catch (Exception e){
          System.out.println("文件不存在");
      }
      //        获取对象的URL
      String presignedObjectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                .bucket("lab-test")
                .object("test.jpg")
                .expiry(3, TimeUnit.MINUTES)
                .method(Method.GET)
                .build());
        System.out.println(presignedObjectUrl);
        //        下载文件
        GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder()
                .bucket("lab-test")
                .object("test.jpg")
                .build());
        System.out.println(getObjectResponse.transferTo(new FileOutputStream("D:\\workspace-java\\lab-test\\files\\123.jpg")));
         // 查询文件夹底下所有文件
        Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder()
                .bucket("lab-test")
                .build());
        listObjects.forEach( itemResult -> {
            try {
                Item item = itemResult.get();
                System.out.println(item.objectName());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
        //移除文件
        minioClient.removeObject(RemoveObjectArgs.builder()
                .bucket("lab-test")
                .object("test.jpg")
                .build());
    }


















