• minio对象存储


    MinIO 是高性能的对象存储,是为海量数据存储、人工智能、大数据分析而设计的,它完全兼容Amazon S3接口,单个对象最大可达5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。MinIO主要采用Golang语言实现,,客户端与存储服务器之间采用http/https通信协议。

    官网: https://min.io/
    中文文档:http://docs.minio.org.cn/docs/
    下载地址:https://min.io/download
    github: https://github.com/minio/minio

    一、minio安装(单机)

    1、创建相关目录

    cd /opt
    mkdir minio
    mkdir data
    touch minio.log
    
    • 1
    • 2
    • 3
    • 4

    2、下载安装包并赋予权限

    wget https://dl.minio.io/server/minio/release/linux-amd64/minio
    chmod 777 minio
    
    • 1
    • 2

    3、设置环境变量

    vim /etc/profile
    # set minio environment
    export MINIO_ROOT_USER=fileadmin
    export MINIO_ROOT_PASSWORD=fileadmin
    
    • 1
    • 2
    • 3
    • 4

    4、启动minio

    nohup /opt/minio/minio server  /opt/minio/data --console-address ":35555" > /opt/minio/minio.log 2>&1 &
    
    • 1

    nohup 和 末尾& :后台启动
    /opt/minio/data:文件存储路径
    –console-address:控制台固定端口
    2>&1:在标准输出直接输入到/opt/minio/minio.log 中

    5、控制台访问

    http://172.169.3.251:62222/buckets 帐号密码:fileadmin fileadmin

    5.1、创建bucket

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

    5.2、创建用户

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

    5.3、创建Service Accounts

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

    二、springboot使用

    1、pom.xml

    <dependency>
                <groupId>io.miniogroupId>
                <artifactId>minioartifactId>
                <version>8.2.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、application.yml

    spring:
      servlet:
        multipart:
          max-file-size: 10MB
          max-request-size: 10MB
    #minio配置
      minio:
        access-key: 控制台创建的用户名(test)
        secret-key: 密码 (12345678)
        url: http://minio服务器IP:9000 (http://127.0.0.1:9000)
        bucket-name: 控制台创建的bucket (test)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3、minio配置文件

    import io.minio.MinioClient;
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ConfigurationProperties(prefix = "spring.minio")
    @Data
    public class MinioConfiguration {
        private String accessKey;
        private String secretKey;
        private String url;
        private String bucketName;
    
        @Bean
        public MinioClient minioClient() {
            return MinioClient.builder()
                    .endpoint(url)
                    .credentials(accessKey, secretKey)
                    .build();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    4、minio工具类

    import com.wdhcr.minioupload.config.MinioConfiguration;
    import io.minio.*;
    import io.minio.http.Method;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import org.springframework.web.multipart.MultipartFile;
    import java.io.InputStream;
    import java.time.ZonedDateTime;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    @Component
    public class MinioComp {
        @Autowired
        private MinioClient minioClient;
        @Autowired
        private MinioConfiguration configuration;
    
        /**
         * @description: 获取上传临时签名
         */
        public Map getPolicy(String fileName, ZonedDateTime time) {
            PostPolicy postPolicy = new PostPolicy(configuration.getBucketName(), time);
            postPolicy.addEqualsCondition("key", fileName);
            try {
                Map<String, String> map = minioClient.getPresignedPostFormData(postPolicy);
                HashMap<String, String> map1 = new HashMap<>();
                map.forEach((k, v) -> {
                    map1.put(k.replaceAll("-", ""), v);
                });
                map1.put("host", configuration.getUrl() + "/" + configuration.getBucketName());
                return map1;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * @description: 获取上传文件的url
         */
        public String getPolicyUrl(String objectName, Method method, int time, TimeUnit timeUnit) {
            try {
                return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                        .method(method)
                        .bucket(configuration.getBucketName())
                        .object(objectName)
                        .expiry(time, timeUnit).build());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
    
        /**
         * @description: 上传文件
         */
        public void upload(MultipartFile file, String fileName) {
            // 使用putObject上传一个文件到存储桶中。
            try {
                InputStream inputStream = file.getInputStream();
                minioClient.putObject(
                        PutObjectArgs.builder()
                                .bucket(configuration.getBucketName())
                                .object(fileName)
                                .stream(inputStream, file.getSize(), -1)
                                .contentType(file.getContentType())
                                .build()
                );
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 删除文件
         */
        public void remove(String objectName) {
            try {
                minioClient.removeObject(
                        RemoveObjectArgs.builder()
                                .bucket(configuration.getBucketName())
                                .object(objectName)
                                .build()
                );
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取文件访问地址
         */
        public String getUrl(String objectName, int time, TimeUnit timeUnit) {
            String url = null;
            try {
                url = minioClient.getPresignedObjectUrl(
                        GetPresignedObjectUrlArgs.builder()
                                .method(Method.GET)
                                .bucket(configuration.getBucketName())
                                .object(objectName)
                                .expiry(time, timeUnit).build()
                );
            } catch (Exception e) {
                e.printStackTrace();
            }
            return url;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112

    5、controller测试类

    import com.wdhcr.minioupload.component.MinioComp;
    import com.wdhcr.minioupload.domain.R;
    import io.minio.http.Method;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.time.ZonedDateTime;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    @RestController
    public class UploadController {
        @Autowired
        private MinioComp minioComp;
    
        @PostMapping("/upload")
        public R upload(@RequestParam("file") MultipartFile file, @RequestParam("fileName") String fileName) {
            minioComp.upload(file, fileName);
            String url = minioComp.getUrl(fileName, 7, TimeUnit.DAYS);
            return R.success(url);
        }
    
        @GetMapping("/policy")
        public R policy(@RequestParam("fileName") String fileName) {
            Map policy = minioComp.getPolicy(fileName, ZonedDateTime.now().plusMinutes(10));
            return R.success(policy);
        }
    
        @GetMapping("/uploadUrl")
        public R uploadUrl(@RequestParam("fileName") String fileName) {
            String url = minioComp.getPolicyUrl(fileName, Method.PUT, 2, TimeUnit.MINUTES);
            return R.success(url);
        }
    
        @GetMapping("/url")
        public R getUrl(@RequestParam("fileName") String fileName) {
            String url = minioComp.getUrl(fileName, 7, TimeUnit.DAYS);
            return R.success(url);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    6、测试用例

    import com.wdhcr.minioupload.component.MinioComp;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.mock.web.MockMultipartFile;
    import org.springframework.web.multipart.MultipartFile;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.UUID;
    import java.util.concurrent.TimeUnit;
    
    @SpringBootTest
    class MinioUploadApplicationTests {
        @Autowired
        private MinioComp minioComp;
    
        @Test
        void upload() throws IOException {
            File pdfFile = new File("D://application.properties");
            FileInputStream fileInputStream = new FileInputStream(pdfFile);
            MultipartFile multipartFile = new MockMultipartFile(pdfFile.getName(), pdfFile.getName(), "application/octet-stream", fileInputStream);
            String filename = UUID.randomUUID().toString() + "-" + multipartFile.getOriginalFilename();
    
            minioComp.upload(multipartFile, filename);
    
            String url = minioComp.getUrl(filename, 7, TimeUnit.DAYS);
            System.err.println(url);
        }
    
        @Test
        public void remove() {
            minioComp.remove("application.properties");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    驱动开发day2
    C++学习笔记一(重载、类)
    pandas或者matplotlib的饼图pie
    『Another Redis DeskTop Manager』用了这款Redis可视化工具,分析效率提升12倍
    C语言strlen模拟实现的三种方式
    css 好看的边框
    多级缓存(笔记)
    实现el-upload可以选择文件夹
    UEFI 源码学习4.1 - PciHostBridgeDxe
    Android学习笔记 1.8 使用Android 9 来签名APK
  • 原文地址:https://blog.csdn.net/qq_17522211/article/details/126867470