Minio入门教学

2023-11-17

Minio 文件存储系统

以往的项目,用的比较多的OSS服务是腾讯云和阿里云的存储服务,最近的几个项目,普遍要使用Minio,所以我在开发服务器和测试服务器上都装上了minio.

一、首先minio的安装

采用docker安装(因为docker安装简单快速)

如果没用过docker的同学请先看我之前发的文章,已经讲解过如何安装docker

1.拉取docker镜像

docker pull minio/minio

2.创建文件宿主机存储目录

一个用来存放配置,一个用来存储上传文件的目录

启动前需要先创建Minio外部挂载的配置文件( /home/minio/config),和存储上传文件的目录( /home/minio/data)

mkdir -p /home/minio/config
mkdir -p /home/minio/data

3.创建Minio容器并运行

docker run -p 9000:9000 -p 9099:9099 \
     --net=bridge \
     --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=fsp-manage" \
     -e "MINIO_SECRET_KEY=springboot-fsp-manage" \
     -v /home/minio/data:/data \
     -v /home/minio/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9099" -address ":9000"

!!注意:因为mobalXterm 连接虚拟机后,会占用9090端口作为web console,所以此处改变端口9099
fsp-manage 是UI控制台登录账户(运行minio后访问,http://192.168.64.138:9099/login)
springboot-fsp-manage 是UI控制台登录密码(运行minio后访问,http://192.168.64.138:9099/login)

4.访问操作

http://serverUrl:9099/login

“serverUrl” 为自己服务器(虚拟机) 用户名,密码如上述
在这里插入图片描述

5.进入控制台点击buckets创建一个桶名称为fsp-dev

在这里插入图片描述

二.接下来就是整合spingboot项目

Java入门 点击该链接跳转到gitee,即可查看整合springboot后的项目

在这里插入图片描述

核心代码之上传文件至Minio

@PostMapping(value = {"/admin/uploadFile","/web/uploadFile"})
    @ApiOperation(value = "上传文件,支持批量上传")
    @ApiImplicitParam(name = "files",value = "文件对象",dataType = "File")
    public ApiResult uploadFile(@RequestParam("files") List<MultipartFile> files) {
        log.info(files.toString());
        if (CollectionUtils.isEmpty(files)) {
            return ApiResult.error("未选择文件!");
        }

        List<MinioResponseDTO> MinioResponseDTOList = new ArrayList<>();
        for (MultipartFile file : files) {
            String originalFilename = file.getOriginalFilename();
//            获取文件拓展名
            String extName = FileUtil.extName(originalFilename);
            log.info("文件拓展名:" + extName);
//            生成新的文件名,存入到minio
            long millSeconds = Instant.now().toEpochMilli();
            String minioFileName = millSeconds + RandomStringUtils.randomNumeric(12) + "." + extName;
            String contentType = file.getContentType();
            log.info("文件mime:{}", contentType);
//            返回文件大小,单位字节
            long size = file.getSize();
            log.info("文件大小:" + size);
            try {
                String bucketName = minioConfig.getBucketName();
                minioClientUtils.putObject(bucketName, file, minioFileName);
                String fileUrl = minioClientUtils.getObjectUrl(bucketName, minioFileName);
                MinioFile minioFile = new MinioFile();
                minioFile.setOriginalFileName(originalFilename);
                minioFile.setFileExtName(extName);
                minioFile.setFileName(minioFileName);
                minioFile.setFileSize(size);
                minioFile.setMime(contentType);
                minioFile.setIsDelete(NumberUtils.INTEGER_ZERO);
                minioFile.setFileUrl(fileUrl);
                boolean insert = minioFile.insert();
                if (insert) {//文件地址写入数据库
                    MinioResponseDTO minioResponseDTO = new MinioResponseDTO();
                    minioResponseDTO.setFileId(minioFile.getId());
                    minioResponseDTO.setOriginalFileName(originalFilename);
                    minioResponseDTO.setFileUrl(fileUrl);
                    MinioResponseDTOList.add(minioResponseDTO);
                }
            } catch (Exception e) {
                log.error("上传文件出错:{}", e);
                return ApiResult.error("上传文件出错");
            }
        }
        return ApiResult.success(MinioResponseDTOList);
    }

核心代码之从minio下载文件至浏览器(也可前端展示)

 @GetMapping("/getPicture")
    public void downloadFile(@RequestParam("fileUrl") String fileUrl, HttpServletResponse response) throws IOException {
        if (StringUtils.isBlank(fileUrl)){
            response.setHeader("Content-type","text/html;charset=UTF-8");
            String msg = "文件下载失败";
            OutputStream ps = response.getOutputStream();
            ps.write(msg.getBytes(StandardCharsets.UTF_8));
            return;
        }
        try {
            //拿到文件路径
            String url = fileUrl.split("9000/")[1];
            //获取文件对象
            InputStream object = minioClientUtils.getObject(MinioConstant.FSP_DEV, url.substring(url.indexOf("/") + 1));
            byte[] bytes = new byte[1024];
            int len = 0;
            response.reset();
            response.setHeader("Content-Disposition","attachment/filename="+
                    URLEncoder.encode(url.substring(url.lastIndexOf("/")+1),"UTF-8"));
            response.setContentType("application/octet-stream");
            response.setCharacterEncoding("UTF-8");
            OutputStream stream = response.getOutputStream();
            while ((len = object.read(bytes))>0){
                stream.write(bytes,0,len);
            }
            stream.close();
        }catch (Exception e){
            response.setHeader("Content-type","text/html;charset=UTF-8");
            String data = "文件下载失败";
            OutputStream ps = response.getOutputStream();
            ps.write(data.getBytes(StandardCharsets.UTF_8));
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Minio入门教学 的相关文章

  • JDK 文档是语言规范的一部分吗?

    只有一名官员Java语言规范 https docs oracle com javase specs jls se8 html index html所有 Java 实现都必须遵守它 API文档怎么样 所有Java实现都需要遵守吗这个版本 ht
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • :nth-of-child和:nth-of-type

    nth of child 用法 nth of child n n可以为数字或者表达式 例如2n 1 指的是奇数项 介绍 第n个孩子 例如 div nth of child 1 等同于 div first of child div的第一个孩子
  • Hadoop的伪分布式运行模式

    Hadoop运行模式包括 本地模式 伪分布式模式 以及完全分布式模式 1 本地模式 安装简单 在一台机器上运行服务 几乎不用做任何配置 但仅限于调试用途 没有分布式文件系统 直接读写本地操作系统的文件系统 2 伪分布式模式 在单节点上同时启
  • typescript—第七天,命名空间

    没有命名空间时的问题 先写一下这样代码 用类的形式在index html中实现header content和Footer部分 类似我们常说的模板 在page ts文件里 写出下面的代码 class Header constructor co
  • 简述 RSA 加密算法实现过程

    银行密码系统安全吗 质数 素数 到底有啥用 李永乐老师11分钟讲RSA加密算法 2018最新 哔哩哔哩 bilibili 质数 和 欧拉函数 公钥 范围 且
  • Python 爬虫学习笔记(十(4))scrapy链接提取器CrawlSpider

    CrawlSpider也可以这样用 对每一个提取出的链接都调用某些操作 创建项目 scrapy startproject 项目的名字 跳转到scrapy文件夹的目录下 创建爬虫文件 语句和之前不同 scrapy genspider t cr
  • Java读取resource目录下图片插入excel导出

    1 将图片放在resoure目录下 2 读取图片并插入excel private void monthContractRow1 Sheet sheet CellStyle style1 String language Workbook wo
  • ElementUI常用组件之布局组件

    安装elementui npm i element ui S 配置ElementUI 1 main js中 引入elementUI 共分三步走 a import element ui b import css文件 c use Element
  • jQuery中$ $()与$(document) this与$(this)三个的区别

    是jquery专用的特殊符号 bai可以说所有dujquery函数的调用都是从 开始的 在jquery里面表示一zhi个选择器 括号dao里面填写一定的表达式就可以选中你想要的元素 jquery的选择器除了能很好地遵循css的表达式外 还额
  • Ubuntu 无法进行SSH连接,开启22端口

    我们在VM中安装好Ubuntu 虚拟机后 经常需要使用Xshell等工具进行远程连接 但是会出现无法连接的问题 原因是Ubuntu中默认关闭了SSH 服务 1 查看Ubuntu虚拟机IP地址 命令 ifconfig 2 利用XShell等工
  • 点击按钮改变颜色 模型动画暂停继续功能

    using System Collections using System Collections Generic using UnityEngine using UnityEngine UI using DG Tweening publi
  • C语言关键字必备练习题

    1 作业标题 642 关于C语言关键字说法正确的是 作业内容 A 关键字可以自己创建 B 关键字不能自己创建 C 关键字可以做变量名 D typedef不是关键字 答案解析 C语言关键字 C语言定义的 具有特定含义 专门用于特殊用途的C语言
  • 【c++】内存四区(代码区、全局区、栈区、堆区)

    文章目录 内存分区模型 代码区 全局区 栈区 堆区 内存分区模型 c 程序在执行时 将内存大方向划分为4个区域 代码区 存放函数体的二进制代码 有操作系统进行管理 全局区 存放全局变量和静态变量以及常量 栈区 由编译器自动分配释放 存放函数
  • C++ 产生随机数

    推荐一个博客 以下转载该博客部分内容 主要代码 include
  • JSP、JSTL标签

  • 02-JavaWeb之Servlet及相关知识点

    一 Servlet 简介 Java Servlet 是运行在 Web 服务器 tomcat 或应用服务器上的程序 它可以接收来自 Web 浏览器或其他 HTTP 客户端的请求 并进行结果的响应 使用 Servlet 可以收集来自网页表单的用
  • 1064 Complete Binary Search Tree (30 分)

    题目 题目链接 题解 数据结构 二叉排序树的中序遍历是单调递增的 完全二叉树具有很好的顺序存储的性质 利用中序遍历和递归 先构造左子树 再对根节点进行赋值 再构造右子树 我是fw 代码 include
  • 【异常】 DevOps工具链SonarQube提示严重的错误,内容为Save and re-use this “Random“,需要使用SecureRandom替换Random

    一 报错内容 二 报错说明 2 1 Random和SecureRandom的区别 Random生成伪随机数 这意味着这些数字并不是真正的随机数 而是由算法生成的 如果攻击者知道生成这些数字的算法 那么Random生成的数字就可以被预测 因此
  • scrapy中使用正确的xpath出现空列表问题

    今天在使用scrapy框架爬取网页时 使用正确的xpath来爬取时 爬取的缺失空列表 代码如下 coding utf 8 import scrapy class HaodfSpider scrapy Spider name haodf st
  • Elasticsearch基本查询

    目录 基本语法 查询所有 match all 匹配查询 match 多字段查询 multi match 精确匹配 term 多词条精确匹配 terms 结果过滤 直接指定字段 指定includes和excludes 布尔组合查询 bool
  • Minio入门教学

    Minio 文件存储系统 以往的项目 用的比较多的OSS服务是腾讯云和阿里云的存储服务 最近的几个项目 普遍要使用Minio 所以我在开发服务器和测试服务器上都装上了minio 一 首先minio的安装 采用docker安装 因为docke