MinIO 对象存储(可以当作免费的图床)

2023-11-04

什么是Minlo

MinIO与传统的存储和其他的对象存储不同的是

特征

一.快速入门

1.下载直接去官网

2.新建minio安装目录,执行如下命令

3.后台启动

4.查看状态

二、进行访问,并设置桶

1.访问

三、springboot进行实现

1.引入依赖

2.在 application.yml 文件中加入 MinIO 服务器的相关信息

3.创建实体类

4、创建核心配置类

5、上传工具类

6.controller接口

测试


什么是Minio

MiniO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

MiniO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或 MySQL。

开源, S3 兼容, 让企业存储更强大,比快更快

MiniO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。

MiniO与传统的存储和其他的对象存储不同的是

它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。

MiniO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学习、大数据、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。

特征

  • 擦除码
  • Bitrot保护
  • 加密
  • WORM
  • 身份认证和管理
  • 连续复制
  • 全局一致性
  • 多云网关

一.快速入门

1.下载直接去官网

wget http://dl.minio.org.cn/server/minio/release/linux-amd64/minio

2.新建minio安装目录,执行如下命令

chmod +x minio //给予权限

export MINIO_ACCESS_KEY=minioadmin //创建账号

export MINIO_SECRET_KEY=minioadmin //创建密码

./minio server /home/minio/data //启动

3.后台启动

nohup ./minio server /home/minio/data > /home/minio/data/minio.log &

4.查看状态

ps -ef|grep minio

二、进行访问,并设置桶

1.访问

地址:http://ip:9000

这里遇到了一个问题,踩坑花了快一个小时的时间正常需要去服务器把9000的防火墙打开,然后就可以正常启动,但是他会跳到别的端口号上面了,刚开始我没想别的,以为是教程的版本过低,我又重新下载了别的版本的,找了对应的几个文档,但是就在最后一筹莫展的时候,突然想着既然你挑了端口,那我把你跳转的端口打开是不是就可以了,结果问题真的出现在这里.

输入账号密码后:

进行创建桶,名字自取,创建完成后服务器home/minio/data下也会创建这个文件目录

进行设置

必须将规则设置成readwrite ,才可进行读取文件,否则只存或者只能读。

三、springboot进行实现

1.引入依赖

<!-- minio 相关依赖 -->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>3.0.10</version>
</dependency>
<!-- alibaba的fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.51</version>
</dependency>
<!-- thymeleaf模板引擎 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2.在 application.yml 文件中加入 MinIO 服务器的相关信息

# minio 文件存储配置信息
minio:
  endpoint: http://ip:9000
  accesskey: minioadmin
  secretKey: minioadmin

3.创建实体类

这一步,我们将配置文件中 minio 的配置信息通过注解的方式注入到 MinioProp 这个实体中,方便后面我们使用

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
/**
 * minio 属性值
 */
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProp {
    /**
     * 连接url
     */
    private String endpoint;
    /**
     * 用户名
     */
    private String accesskey;
    /**
     * 密码
     */
    private String secretKey;
}
 

4、创建核心配置类

通过注入 MinIO 服务器的相关配置信息,得到 MinioClient 对象,我们上传文件依赖此对象

import io.minio.MinioClient;
import io.minio.errors.InvalidEndpointException;
import io.minio.errors.InvalidPortException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
 * minio 核心配置类
 */
@Configuration
@EnableConfigurationProperties(MinioProp.class)
public class MinioConfig {
 
    @Autowired
    private MinioProp minioProp;
 
    /**
     * 获取 MinioClient
     *
     * @return
     * @throws InvalidPortException
     * @throws InvalidEndpointException
     */
    @Bean
    public MinioClient minioClient() throws InvalidPortException, InvalidEndpointException {
        return new MinioClient(minioProp.getEndpoint(), minioProp.getAccesskey(), minioProp.getSecretKey());
    }
}

5、上传工具类

import com.alibaba.fastjson.JSONObject;
import com.zyxx.email.common.redis.RedisUtil;
import com.zyxx.email.utils.DateUtils;
import io.minio.MinioClient;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
 
@Slf4j
@Component
public class MinioUtils {
 
    @Autowired
    private MinioClient client;
    @Autowired
    private MinioProp minioProp;
 
    /**
     * 创建bucket
     *
     * @param bucketName bucket名称
     */
    @SneakyThrows
    public void createBucket(String bucketName) {
        if (!client.bucketExists(bucketName)) {
            client.makeBucket(bucketName);
        }
    }
 
    /**
     * 上传文件
     *
     * @param file       文件
     * @param bucketName 存储桶
     * @return
     */
    public JSONObject uploadFile(MultipartFile file, String bucketName) throws Exception {
        JSONObject res = new JSONObject();
        res.put("code", 0);
        // 判断上传文件是否为空
        if (null == file || 0 == file.getSize()) {
            res.put("msg", "上传文件不能为空");
            return res;
        }
        try {
	       	// 判断存储桶是否存在
	        createBucket(bucketName);
	        // 文件名
	        String originalFilename = file.getOriginalFilename();
	        // 新的文件名 = 存储桶名称_时间戳.后缀名
	        String fileName = bucketName + "_" + System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf("."));
	        // 开始上传
	        client.putObject(bucketName, fileName, file.getInputStream(), file.getContentType());
	        res.put("code", 1);
	        res.put("msg", minioProp.getEndpoint() + "/" + bucketName + "/" + fileName);
	        return res;
		}  catch (Exception e) {
            log.error("上传文件失败:{}", e.getMessage());
        }
        res.put("msg", "上传失败");
        return res;
    }
}

6.controller接口

import com.alibaba.fastjson.JSONObject;
import com.zyxx.email.common.minio.MinioUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
 
import javax.servlet.http.HttpServletRequest;
 
@Controller
public class MinioController {
 
    @Autowired
    private MinioUtils minioUtils;
 
 
    /**
     * 上传
     *
     * @param file
     * @param request
     * @return
     */
    @PostMapping("/upload")
    @ResponseBody
    public String upload(@RequestParam(name = "file", required = false) MultipartFile file, HttpServletRequest request) {
        JSONObject res = null;
        try {
            res = minioUtils.uploadFile(file, "product");
        } catch (Exception e) {
            e.printStackTrace();
            res.put("code", 0);
            res.put("msg", "上传失败");
        }
        return res.toJSONString();
    }
}

测试

代码仓库(跟上面的代码有一些出入

https://github.com/linxun1209/springboot-minio.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MinIO 对象存储(可以当作免费的图床) 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 通过互联网IP地址从一台计算机访问xampp到另一台计算机

    我试图从另一台计算机访问我的 xampp 它显示为禁止错误 然后我在 google 上搜索答案 因为他们告诉在 apache 文件夹中的 httpd conf 文件中更改一些设置 如下所示 Order Deny Allow Deny fro
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • 微信外环境静态h5跳转小程序,如何传参?

    公司最近提了一个不常见的需求 就是在微信外环境静态h5跳转小程序并且还要传参 在查阅了大量资料后成功解决 官网地址 静态网站 H5 跳小程序 一 环境准备 1 开通微信云开发和静态网站 点击微信开发者工具中的云开发 现在是可以免费体验1个月
  • mysql中文乱码解决方案_Mysql中文乱码解决方案

    Mysql中文乱码解决方案 时间 2017 07 11 来源 华清远见JAVA学院 中文乱码问题一直是我们编程过程中比较常见又让人头疼的问题 但是只要按照标准进行配置 就能很好的避免出现中文乱码问题 今天小编就和大家分享下Mysql中文乱码
  • 统计学基础-数据的图表展示

    理论基础 什么是统计学 统计学分为描述统计和推理统计 统计学研究什么 统计学没有固定的研究对象 统计学研究的是来自各个领域的数据 靠解决其他领域内的工作而生存 我们并不能因此就看轻统计学 就好像计算机现在渗透在各行各业 我们生活中的方方面面
  • iOS支付宝支付接入的几个坑—以及解决办法

    因为近期项目中需要接入支付宝支付功能 自己也爬了很多的坑 所以做了一下这边文章供大家学习参考 远离爬坑 文章主要讲到以下五部分 一 支付宝开放平台创建应用 二 签约移动支付功能 三 接入支付前的准备工作附准备工作中遇到难题的解决方法 四 配
  • window.open打开新窗口报错ie 位指明错误,原因是window没有加引号!

    function JsMod htmlurl tmpWidth tmpHeight htmlurl getRandomUrl htmlurl var newwin window open htmlurl window height tmpH
  • VUE前端框架

    目录 vue 概述 MVVM框架 入门案例 创建HTML文件 并引入vue js 练习 Vue的基础语法 1 运算符 函数 2 解析类型丰富的data 3 data的三种写法 二 Vue的指令 1 概述 2 v model v cloak
  • Download-centos7-repo

    Setup Local Yum Repository On CentOS 7 使用ftp和createrepo来构建iso中的rpm包源 install and cache rpm package cat etc yum conf more
  • 【网络结构设计】6、CSPNet

    文章目录 一 背景 二 方法 2 1 DenseNet 网络结构 2 2 Cross Stage Partial DenseNet 2 3 将 CSPNet 和其他结构结合 三 效果 论文 CSPNet A new backbone tha
  • 数据库相关中间件收录集

    数据库中间件 这里主要介绍互联网行业内有关数据库的相关中间件 数据库相关平台主要解决以下三个方面的问题 为海量前台数据提供高性能 大容量 高可用性的访问 为数据变更的消费提供准实时的保障 高效的异地数据同步 应用层通过分表分库中间件访问数据
  • ajaxForm和ajaxSubmit

    ajaxForm和ajaxSubmit 1 AjaxForm ajaxForm不能提交表单 在document的ready函数中 使用ajaxForm来为AJAX提交表单进行准备 提交动作必须由submit开始 document ready
  • java kafka关闭连接_kafka的连接问题,我如何通过代码知道服务端的kafka服务是否开启?...

    我在电脑的虚拟机搭建了kafka服务 在本地使用Java客户端进行访问 现在假如虚拟机上的服务被我关闭 我在本地的代码就会无法去向kafka推送消息 并且会在1分钟后报一个timeout的错 我可以控制这个timeout的时间吗 我应该怎么
  • 域名与IP地址的联系与区别

    转载自一个好朋友的博客链接 略有修改 共同学习 共同进步 我们也知道每一台机都有一个唯一ip地址 特别难记 所以出现了今天的DNS 域名 当我们的计算机想要和一个远程机器连接时 我们可以申请连接该机器ip地址下的DNS 例如 www bai
  • STM32应用开发实践教程:基于 RS-485 总线的多机通信应用开发

    5 1 1 任务分析 本任务要求设计一个基于 RS 485 总线的多机通信系统 系统中有两台设备 理论上最多可 接入 32 台设备 其中一台设备作为主机 连接 OLED 显示屏 另一台设备作为从机 连接温 湿度传感器 DHT11 与 LED
  • Centos 7安装部署PostgreSql 12

    安装 yum install https download postgresql org pub repos yum reporpms EL 8 x86 64 pgdg redhat repo latest noarch rpm yum i
  • 装饰器原理

    原理 原有函数 def fun 1 正常调用原有函数 fun 1 现有需要需要在原有函数基础上添加新功能 但是不改变原有函数法一 1 添加新函数 装饰一波 def fun 2 fun 1 嵌套函数 返回函数地址 fun 3 调用时才执行 d
  • Java数组全排列

    递归法 当数组元素重复时 会出现重复排列 public static void main String args int arr new int 1 2 3 4 5 6 7 8 9 f arr 0 static void f int arr
  • 聊聊Qt中的Widget调色板QPalette

    在实际的应用开发中 经常需要对某个窗体或某个控件的颜色外观 如背景色 前景色等进行设置 已达到界面美化的效果 Qt中的窗体或控件都是Widget类 Qt中提供的调色板QPalette类就是专门用于管理控件的外观显示 QPalette类相当于
  • bert模型蒸馏实战

    由于bert模型参数很大 在用到生产环境中推理效率难以满足要求 因此经常需要将模型进行压缩 常用的模型压缩的方法有剪枝 蒸馏和量化等方法 比较容易实现的方法为知识蒸馏 下面便介绍如何将bert模型进行蒸馏 一 知识蒸馏原理 模型蒸馏的目的是
  • 计算机的配件知识,组装一台电脑需要哪些配件 DIY装机必看的电脑硬件知识详解 (全文)...

    组装电脑是指用户可以按照自己的预算和用途来 在兼容的基础上 灵活搭配电脑硬件 又称为DIY组装电脑 DIY攒机等 由于灵活 高性价比 按需搭配等特性 是不少台式电脑主流方案之选 那么组装一台电脑需要哪些配件 下面 电脑爱好者 分享一下DIY
  • MinIO 对象存储(可以当作免费的图床)

    什么是Minlo MinIO与传统的存储和其他的对象存储不同的是 特征 一 快速入门 1 下载直接去官网 2 新建minio安装目录 执行如下命令 3 后台启动 4 查看状态 二 进行访问 并设置桶 1 访问 三 springboot进行实