分布式文件系统--MinIO

news2024/11/19 15:35:07

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maya vs Blender:制作3D动画首选哪一个?

就 3D 动画而言&#xff0c;有两款3D软件引发了最多的争论&#xff1a;Blender 与 Maya。这两个强大的平台都提供强大的工具集&#xff0c;使动画故事和角色栩栩如生。但作为一名3D动画师&#xff0c;您应该投入时间学习和创作哪一个呢&#xff1f;下面我将从以下六点给您一个清…

从0开始用C写贪吃蛇(基于链表)

目录 1. 游戏背景 2. 游戏效果演示​编辑​编辑​编辑 3. 实现目标 4. 技术要点 5. 控制台程序 5.1 设置控制台窗口的长宽和名字 5.2 控制台屏幕上的坐标COORD 6.Win32 API 6.1 GetStdHandle 6.2 GetConsoleCursorInfo 6.3 CONSOLE_CURSOR_INFO 6.4 SetConsole…

python监听html click教程

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python实现监听HTML点击事件 在Web开发中&#xff0c;经常需要在用户与页面交互时执行一些…

电磁兼容(EMC):静电放电(ESD)抗扰度试验深度解读(七)

目录 1. 第一步 确定电磁环境 2. 第二步 确认设备工作状态 3. 第三步 制定试验计划 4. 间接施加的放电 4.1 水平耦合板 4.2 垂直耦合板 静电抗扰度的试验测试细节对测试结果影响比较大&#xff0c;本文详细介绍静电抗扰度试验的测试程序和注意事项。 1. 第一步 确定电磁…

工作任务管理平台作品集源文件 figma格式UX/UI设计师作品集

交付文件&#xff1a;作品集源文件项目源文件包装样机源文件字体文件 交付格式&#xff1a;figma、psd 作品集文件页数&#xff1a;28页 项目文件页数&#xff1a;12页&#xff08;Web&#xff09;12页&#xff08;App&#xff09; 以下重点哦&#xff0c;请认真阅读&#…

怡宝母公司冲刺上市:产能未满仍要募资扩产,突击分红25亿元

又一家瓶装水企业冲刺上市。 近日&#xff0c;怡宝母公司华润饮料&#xff08;控股&#xff09;有限公司&#xff08;下称“华润饮料”&#xff09;递交招股书&#xff0c;准备在港交所主板上市&#xff0c;BofA securities&#xff08;美银证券&#xff09;、中银国际、中信证…

nosql数据库 redis

一、介绍 1、redis与mysql的区别&#xff1a; Redis是一种基于键值对的内存数据库&#xff0c;数据存储在内存中&#xff0c;因此读写速度非常快。它支持多种数据结构&#xff0c;如字符串、哈希、列表等。 MySQL是一种关系型数据库&#xff0c;数据以表格的形式组织存储在磁…

linux-进程(2)

1.通过系统调用获取进程标示符 进程id&#xff08;PID&#xff09; 父进程id&#xff08;PPID&#xff09; 每一个可执行程序运行起来之后都会成为一个进程&#xff0c;每个进程都有一个自己的id&#xff0c;以及一个父进程id&#xff0c;父进程就是创建自己进程的进程&#xf…

玩转nginx的配置文件3

1. limit_req_zone配置限流 limit_req_zone $binary_remote_addr zonemylimit:10m rate10r/s;upstream myweb {server 10.0.105.196:80 weight1 max_fails1 fail_timeout1;}server {listen 80;server_name localhost;location /login {limit_req zonemylimit;proxy_pass http:…

C++/QT + Mysql + Tcp 企业协作管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 1、项目概要&#xff1a;C/S架构、数据库Mysql、C、QT&#xff1b;支持实时通信、局域网内通信&#xff0c;可多个客户端同时登录&#xff1b; 2、&#xff08;Server&#xff09;管理端&#xff1a;用户管理、…

详解js中的console对象

对于前端开发而言&#xff0c;console对象大家肯定都很熟悉&#xff0c;最常用的 console.log() 是开发调试必用的 但是对于console对象的其他方法&#xff0c;相对而言使用的就比较少了。下面详细介绍一下&#xff1a; 谷歌浏览器输出console对象&#xff1a; 值得一提的是不…

2018-2023年上市公司富时罗素ESG评分数据

2018-2023年上市公司富时罗素ESG评分数据 1、时间&#xff1a;2018-2023年 2、来源&#xff1a;整理自WIND 3、指标&#xff1a;证券代码、简称、ESG评分 4、范围&#xff1a;上市公司 5、指标解释&#xff1a; 富时罗素将公司绿色收入的界定和计算作为公司ESG 评级打分结…

Windows批处理脚本,用于管理Nginx服务器

先看截图&#xff1a; Windows批处理脚本&#xff0c;用于管理Nginx服务器。它提供了启动、重启、关闭Nginx以及刷新控制台等功能。 设置环境变量&#xff1a; set NGINX_PATHD:&#xff1a;设置Nginx所在的盘符为D盘。set NGINX_DIRD:\nginx1912\&#xff1a;设置Nginx所在…

以太网ARP协议解析

一、什么是ARP协议 ARP协议&#xff0c;全称是Address Resolution Protocol&#xff0c;即地址解析协议。 ARP协议的作用&#xff0c;就是在已知目标设备的IP地址但是不知道其MAC地址的时候&#xff0c;根据IP地址&#xff0c;获取到其MAC地址&#xff0c;以便组成完整的IP包进…

profinet协议基础

文章目录 工业以太网自动化通讯金字塔工业以太网技术比较 profinet概述profinet特性 EtherNet通信EtherCAT通信EtherCat特性EtherCat过程同步 工业以太网 工业以太网是基于IEEE 802.3 (Ethernet)的强大的区域和单元网络。 自动化通讯金字塔 各个组织与工业以太网 工业以太网…

2024.4.25

#include <iostream> #include <iomanip> using namespace std; class Person{const string name;int age;char sex; public:Person(const string name):name(name){cout << "第一个Person构造函数" << endl;}Person():name("zhangsan&…

面试经典150题——路径总和

​ 1. 题目描述 2. 题目分析与解析 2.1 思路一 注意题目的关键点&#xff1a;判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;起点是root&#xff0c;终点是叶子节点。 那么我们就可以从根节点按照层序遍历的方式&#xff0c;从根节点从根到 叶子不断对路径进行加…

javaSE(九):线程

目录 一、程序,进程,线程 1.概念 2.三者之间的关系&#xff1a; 二、创建线程 ①继承Thread类的方式 ②实现Runnable接口的方式 三、Thread类中方法 1.常用方法 2.线程优先级 四、线程状态 ①线程在它的生命周期中会处于不同的状态 ②线程的状态 五、多线程 1.概念…

君正X2100 RTOS 固件升级

使用cloner工具烧写固件需要在上电之前让boot_sel[2:0]处于boot from USB模式&#xff0c;但是电路板装在机壳内部后不方便改变boot_sel[2:0]的状态&#xff0c;如果要升级固件&#xff0c;需要通过机壳留出的USB口、网口、或者无线网络进行固件更新。 一、升级方案 1、固件分…

vivado Versal 串行 I/O 硬件调试流程、使用 Vivado Serial I/O Analyzer 来调试设计

Versal 串行 I/O 硬件调试流程 Versal ™ ACAP 无需再生成 IBERT IP &#xff0c; 因为使用系统内串行 I/O 调试所需的必要逻辑现已集成到 GTY 收发器架构内。使 用 GTY 收发器的任何设计均可用于串行 I/O 硬件调试。 Versal 串行 I/O 硬件调试流程具有 2 个不同阶…