Springboot功能模块之文件上传(minio)

一、概述

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());

    }

三、MinIO集群部署

3.1纠删码模式部署

纠删码(Erasure Code)简称EC,是一种数据保护方法,也是一种算法;

MinIO对纠删码模式的算法进行了实现,采用Reed-Solomon code(简称RScode)纠错码将对象拆分成N/2数据和N/2奇偶校验块,Reed Solomon利用范德蒙矩阵(Vandermonde matrix)、柯西矩阵(Cauchy matrix)的特性来实现;

即将数据拆分为多个数据块和多个校验块,分散存储在不同的磁盘上,即使在部分磁盘损坏或丢失的情况下,也可以通过剩余的数据块和校验块恢复出原始数据;

 

要实现Spring BootMinio的大文件上传并解压的功能,可以按照以下步骤进行操作: 1. 首先,在Spring Boot项目的pom.xml文件中引入Minio的依赖。可以使用以下代码将Minio的依赖添加到项目中: ``` <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.1</version> </dependency> ``` 2. 然后,将大文件分片并上传到Minio对象存储服务。可以按照以下步骤进行操作: - 将要上传的大文件进行分片处理,可以使用文件分片算法将大文件分成多个小块。 - 将分片后的文件依次上传到Minio对象存储服务,并指定一个临时文件名。 3. 分片上传完成后,将所有分片合并为一个完整的文件。可以按照以下步骤进行操作: - 从Minio中读取所有分片文件的流。 - 将分片流写入到一个临时文件中,以便后续解压。 4. 解压临时文件。可以按照以下步骤进行操作: - 使用合适的解压库或工具,对临时文件进行解压。 - 解压后的文件可以按需求进行进一步处理,例如再次上传到Minio或其他存储系统。 综上所述,要实现Spring BootMinio的大文件上传并解压功能,需要将文件分片并上传到Minio,然后将分片合并为完整文件,最后解压文件。这样可以实现大文件的上传和解压操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring boot + minio 分片上传](https://blog.csdn.net/XIAOTONGZHU/article/details/130346735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [SpringBoot 使用 Minio 进行文件存储](https://blog.csdn.net/qq_43692950/article/details/125961685)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Windows常用软件压缩包,后端Java适用于springboot 2.6.x等高版本](https://download.csdn.net/download/m0_55710969/85062866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟雨平生9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值