分布式文件系统--MinIO

1 MinIO安装(Docker)

        ●在root目录下新建docker_minio文件夹

        ●在docker_minio文件夹下新建config文件夹,data文件夹

        ●在root目录下新建docker_compose文件夹,在docker_compose文件夹中添加docker-compose.yaml

services:
  minio:
    image: quay.io/minio/minio
    container_name: minio_container
    ports:
      - "9000:9000" #api接口(内部访问)
      - "9001:9001" #控制台端口(外部界面)
    environment:
      TZ: Asia/Shanghai #时区上海
      MINIO_ROOT_USER: abc #管理后台用户名
      MINIO_ROOT_PASSWORD: abc #管理后台密码(最少8个字符)
      MINIO_COMPRESS: "off" #开启压缩(on开启,off关闭)
      MINIO_COMPRESS_EXTENSIONS: "" #扩展名  .pdf  .doc为空,所有类型均压缩
      MINIO_COMPRESS_MIME_TYPES: "" #mine类型application/pdf为空,所有类型均压缩
    volumes:
      - "/root/docker_minio/data:/data" #映射当前目录下的打他目录至容器内/data目录
      - "/root/docker_minio/config:/root/.minio" #映射配置目录
    command: server --address ':9000' --console-address ':9001' /data #服务器地址是9000,服务器控制台地址是9001,数据储存在/data下
    privileged: true
    networks:
      - sunner_network

        ●通过docker compose up -d命令执行docker-compose.yaml文件(必须在docker_compose文件夹目录下执行),然后系统会自动拉取minio镜像,创建并启动minio容器

​​​​​​​        ●执行docker ps -a命令,出现下图,表示安装和启动minio成功

2 MinIO的使用

        访问MinIO有2个端口,分别是9000端口和9001端口

                9000端口是用于内部访问,比如用户通过SpringBoot接口间接访问MinIO

                9001端口是用于外部访问,即通过浏览器访问

2.1 桶

        MinIO所有的文件都保存在中,可以将桶理解为文件夹

2.1.1新建桶

2.1.2 上传文件

2.2 网页访问图片

2.2.1 复制访问链接

        ●将127.0.0.1修改为MinIO所在服务器地址

        ●去掉访问链接后半段(去掉.png之后的)

2.2.2 修改桶权限为public

2.2.3 访问图片

        在浏览器的地址栏输入"访问链接"

3 SpringBoot集成MinIO

3.1 引入依赖

<dependency>
	<groupId>io.minio</groupId>
	<artifactId>minio</artifactId>
	<version>8.5.9</version>
</dependency>

3.2 application.yaml

minio:
  endpoint: http://123.123.123.123:9000  #minio所在服务器访问地址
  accessKey: abc  #用户名
  secretKey: abc  #密码

3.3 MinIO配置类

@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProp {
    private String endpoint;
    private String accessKey;
    private String secretKey;

    public String getEndpoint() {
        return endpoint;
    }

    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    public String getAccessKey() {
        return accessKey;
    }

    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }

    public String getSecretKey() {
        return secretKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }
}

3.4 通过MinIO配置类创建MinioClient,并注册进SpringIOC容器

@Configuration  //"配置类"注解
@MapperScan({"xyz.aboluo.minio.dao"})  //dao接口包扫描
//@EnableConfigurationProperties({Teacher.class})
public class MinioAutoConfiguration {

    @Autowired
    private MinioProp minioProp;

    @Bean
    public MinioClient getMinioClient() {
        return MinioClient.builder()
                .endpoint(minioProp.getEndpoint())
                .credentials(minioProp.getAccessKey(), minioProp.getSecretKey())
                .build();
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址(允许任何地址访问)
        corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头(允许任何请求头访问)
        corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法(允许任何方法(GET,POST等等)方法)
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
        return new CorsFilter(source);
    }
}

3.5 Controller接口

@RestController
@RequestMapping("/minioFileHandle")
public class MinioController {
    private static final Logger LOGGER = LoggerFactory.getLogger(MinioController.class);

    @Autowired
    private MinioClient minioClient;

    /**
     * 获取bucket列表
     *
     * @return
     */
    @RequestMapping("/bucketList.do")
    public Result bucketList() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        List<Map<String, String>> buckets = new ArrayList<>();
        for (Bucket bucket : minioClient.listBuckets()) {
            Map<String, String> returnBucket = new HashMap<>();
            returnBucket.put("bucketName", bucket.name());
            returnBucket.put("creationDateTime", bucket.creationDate().toString());
            buckets.add(returnBucket);
        }
        return Result.success(buckets);
    }

    /**
     * 查询bucket下的所有文件信息
     *
     * @return
     */
    @RequestMapping("/queryBucketFiles.do")
    public Result queryBucketFiles(@RequestParam String bucketName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        //检查桶是否存在
        if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
            throw new SunnerRuntimeException(Result.ResultEnum.BUCKET_NOT_EXIST);
        }
        //遍历封装桶中的文件信息
        Iterator<io.minio.Result<Item>> iterator = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build()).iterator();
        List<Object> items = new ArrayList<>();
        while (iterator.hasNext()) {
            Item item = iterator.next().get();
            items.add(JSON.parse(String.format("{'fileName':'%s','fileSize':'%s','lastModified':'%s'}", item.objectName(), item.size(), Date.from(item.lastModified().toInstant()))));
        }
        return Result.success(items);
    }

    /**
     * 文件下载
     *
     * @return
     */
    @RequestMapping("/download.do")
    public Result download(@RequestParam String bucketName, @RequestParam String fileName, HttpServletResponse response) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        response.setHeader("picture-upload-date-time", URLEncoder.encode("abccc", StandardCharsets.UTF_8));
        response.getOutputStream().write(minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()).readAllBytes());
        return Result.returnVoid();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/574481.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新品发布!无人机装调检修实训系统

近年&#xff0c;我国密集出台相关产业政策&#xff0c;推动低空经济从探索走向发展&#xff0c;根据新华网数据&#xff0c;2030年低空经济规模有望达2万亿。无人机专业属于跨学科的综合性专业&#xff0c;其中装调检测技术是无人机教培的重要组成部分。 天途推出无人机装调检…

全额退款20000,what?

接单的时候有多兴奋&#xff0c;退单的时候就有多落寞。今天我对客户全额退款了&#xff0c;跟踪了10天的项目正式结束。 这是我接单以来项目单价最高的一个项目&#xff0c;本来不太想接的&#xff0c;因为业务领域不擅长&#xff0c;又想挑战一下。兜兜转转找了几个人因为各种…

19-ESP32-S3外设IIC

ESP32-S3的IIC 引言 ESP32-S3是一款集成了Wi-Fi和蓝牙功能的低成本、多功能微控制器。在这篇博客中&#xff0c;我们将详细介绍ESP32-S3的IIC&#xff08;Inter-Integrated Circuit&#xff09;接口&#xff0c;也被称为I2C。 IIC简介 IIC是一种串行、同步、多设备、半双工…

【机器学习】03. SMOTE算法实现数据集单个不平衡的样本扩充

背景&#xff1a;通常在处理分类问题中数据不平衡类别。使用SMOTE算法对其中的少数类别进行过采样&#xff0c;以使其与多数类别的样本数量相当或更接近。 直接上代码 from imblearn.over_sampling import SMOTE from sklearn.datasets import make_classification from colle…

openGauss学习笔记-271 openGauss性能调优-TPCC性能调优测试指导-测试MOT-TPCC性能

文章目录 openGauss学习笔记-271 openGauss性能调优-TPCC性能调优测试指导-测试MOT-TPCC性能271.1 TPC-C简介271.2 系统级优化271.3 BenchmarkSQL&#xff1a;开源TPC-C工具271.4 运行基准271.5 结果报告 openGauss学习笔记-271 openGauss性能调优-TPCC性能调优测试指导-测试MO…

AI智能写作工具,一键智能改写文章简单又高效

随着人们生活节奏的加快和工作压力的增大&#xff0c;如何在繁忙的日程中高效地写作成为了许多人的难题。但是随着人工智能技术的不断发展和应用&#xff0c;AI智能写作工具的出现&#xff0c;成为了许多人解决写作难题的利器。今天小编就来跟大家分享下AI智能写作工具&#xf…

自动驾驶行业源代码防泄漏解决方案

行业背景&#xff1a; 随着新一代信息通信及人工智能技术的快速发展&#xff0c;汽车作为这些新技术应用的重要载体&#xff0c;正在加速向智能化和网联化转型&#xff0c;以自动驾驶研发为主业的企业也越来越多&#xff0c;如何保障自己研发的算法、模型、系统不被研发人员离…

百度沈抖:智能,生成无限可能

4月16日&#xff0c;Create 2024百度AI开发者大会在深圳举行。会上&#xff0c;百度集团执行副总裁、百度智能云事业群总裁沈抖正式发布新一代智能计算操作系统——百度智能云万源。它能管理万卡规模的集群&#xff0c;极致地发挥GPU、CPU的性能&#xff1b;它有强大的大模型作…

创新科技赋能旅游服务:智慧文旅引领旅游发展新篇章,智能体验助力产业转型升级

随着科技的飞速发展和人们生活水平的提高&#xff0c;旅游业正迎来前所未有的发展机遇。创新科技在旅游服务领域的广泛应用&#xff0c;不仅提升了旅游体验的品质&#xff0c;也为旅游产业的转型升级注入了新的动力。智慧文旅作为旅游业与信息技术深度融合的产物&#xff0c;正…

【机器学习-12】数据探索---python主要的探索函数

在上一篇博客【机器学习】数据探索(Data Exploration)—数据质量和数据特征分析中&#xff0c;我们深入探讨了数据预处理的重要性&#xff0c;并介绍了诸如插值、数据归一化和主成分分析等关键技术。这些方法有助于我们清理数据中的噪声、消除异常值&#xff0c;以及降低数据的…

AI视频教程下载:用ChatGPT和 MERN 堆栈构建 SAAS 项目

这是一个关于 掌握ChatGPT 开发应用的全面课程&#xff0c;它将带领你进入 AI 驱动的 SAAS 项目的沉浸式世界。该课程旨在使你具备使用动态的 MERN 堆栈和无缝的 Stripe 集成来构建强大的 SAAS 平台所需的技能。 你将探索打造智能解决方案的艺术&#xff0c;深入研究 ChatGPT 的…

PM2管理器无法使用解决方法

之前的项目全是依靠PM2管理器部署的&#xff0c;部署快速&#xff0c;也便于管理 但是宝塔实在是bug毛病太多&#xff0c;最近这两天又出毛病了 这次的问题是在PM2管理器的node版本中无法进行版本切换&#xff0c;如果是第一次使用PM2的话甚至无法设置node版本&#xff0c;之前…

docker 集群管理实战mesos+zookeeper+marathon(一)

一 实验环境 1.1 系统版本&#xff0c;本实验使用cnetos7.9版本镜像 1.2 准备5台虚拟机&#xff0c;其中3台master&#xff0c;两台slave&#xff0c;使用克隆的方式 1.3 使用远程连接工具登录 1.4 修改主机名 1.5 设置域名映射 每个虚拟机都配置一下&#xff0c;这里就演示一…

区块链基础——区块链应用架构概览

目录 区块链应用架构概览&#xff1a; 1、区块链技术回顾 1.1、以太坊结点结构 1.2、多种应用场景 2、区块链应用架构概览 2.1、传统的Web2 应用程序架构 2.2、Web3 应用程序架构——最简架构 2.3、Web3 应用程序架构——前端web3.js ether.js 2.4、Web3 应用程序架构—…

浅谈菊风实时音视频 (RTC)与实时操作系统 (RTOS) 在智能硬件领域应用

近年来&#xff0c;菊风通过实时音视频赋能智能手表、智能门禁、智能门锁/门铃、智能眼镜等数十种智能硬件&#xff0c;与一众合作伙伴共同探索在IoT智能硬件领域的不同场景应用&#xff0c;积累了丰富的实践经验。在智能硬件中&#xff0c;RTOS因其轻量化的系统内核&#xff0…

C#基础之函数基础

函数 文章目录 1、函数基础1、概念2、函数位置3、基本语法4、实际运用5、return 2、ref 和 out1、ref 和 out 使用2、区别思考 登录 3、变长参数和参数默认值1、变长参数2、参数默认值 4、函数重载5、递归函数思考1 阶乘思考2 阶乘相加思考3 竹竿减半思考4 递归循环输出 1、函数…

多客圈子交友系统 uniapp+thinkphp6适配小程序/H5/app/api全开源,多款插件自选,支持个性定制!

网上交友的优点包括&#xff1a; 1. 方便&#xff1a;网上交友可以随时随地进行&#xff0c;不受时间和空间的限制&#xff0c;方便且高效。 2. 匿名性&#xff1a;网上交友可以实现匿名性&#xff0c;用户可以匿名地搜索、聊天或交换信息&#xff0c;保护个人隐私和安全。 3.…

RE | BUUCTF 刮开有奖1

题目&#xff1a;BUUCTF 刮开有奖1 参考&#xff1a; BUUCTF 刮开有奖&#xff08;特别详细了&#xff0c;尽自己全力理解所写&#xff09;&#xff08;这是主参考&#xff0c;写得很详细 BUUCTF_刮开有奖&#xff08;主参考的参考&#xff0c;思路很清晰 我是大菜鸡…尽力写自…

报错:图片验证码接口对接vue+springboot(下一个笔记会记录整个验证码的代码)

问题&#xff1a;空指针异常ai: 根据错误堆栈信息中提供的方法调用位置&#xff0c;看起来空指针异常是在 AuthCodeServiceImpl 类的 authUserCoded 方法的第 41 行发生的。 为了解决这个问题&#xff0c;你可以检查 AuthCodeServiceImpl 类中 authUserCoded 方法的第 41 行&am…

Qt xml示范

1.数据格式 #ifndef XML_DATA_H #define XML_DATA_H#include<QWidget>struct Student {int s_id;QString s_name;double s_math_score;double s_english_score;}; struct Teacher{int t_id;QString t_name;QVector<Student> t_students_v; };#endif // XML_DATA_H…