SpringBoot 对象存储 MinIO

news2024/11/24 2:49:18

SpringBoot 对象存储 MinIO

1.MinIO简介

MinIO 是一个基于 Go 实现的高性能、兼容 S3 协议的对象存储。它采用 GNU AGPL v3 开源协议,项目地址是 https://github.com/minio/minio,官网是 https://min.io。

它适合存储海量的非结构化的数据,例如说图片、音频、视频等常见文件,备份数据、容器、虚拟机镜像等等,小到 1 KB,大到 5 TB 都可以支持。

国内阿里巴巴、腾讯、百度、华为、中国移动、中国联通等企业在使用 MinIO,甚至不少商业公司二次开发 MinIO 来提供商业化的云存储产品。

疑问:为什么越来越少使用 FastDFS 实现文件存储服务呢?

部署运维复杂、无官方文档、缺乏长期维护的团队、性能较差、未提供 Docker & Kubernetes 集成方案等等原因。

2. MinIO Server 安装

由于 MinIO 是 Go 写的,所以就一个运行程序,因此安装部署 MinIO 就非常简单。

文档 https://min.io/download

2.1 Linux

## 国外资源,龟速下载
## /usr/local/minio 存储目录;--console-address 是 UI 界面的端口
wget https://dl.min.io/server/minio/release/linux-amd64/minio 
chmod +x minio
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=admin123 ./minio server /usr/local/minio --console-address ":9001" 

2.2Docker

Linux 或 MacOS:

cd /usr/local/
mkdir minio

vi dockercompose.yml创建dockercompose.yml文件,填写内容如下

version: '3'
services:
  minio:
    image: minio/minio
    container_name: myminio
    ports:
      - "9001:9000"
    volumes:
      - /usr/local/minio/data:/data
      - /usr/local/minio/config:/root/.minio
    environment:
      MINIO_ROOT_USER: "admin"
      MINIO_ROOT_PASSWORD: "admin123"
    command: server /data
    restart: always

在上面的示例中,

  1. 我们定义了一个名为minio的服务,使用minio/minio镜像。

  2. 我们将容器的9000端口映射到主机的9000端口,

具体来说,9001:9000 的格式是 <主机端口>:<容器端口>。通过这样的端口映射,可以在主机上的 9000 端口访问容器内的服务或应用程序。以便能够通过主机访问MinIO。

  1. 数据目录./data将与容器的/data目录进行挂载,这样数据可以在容器和主机之间共享。

  2. environment部分定义了MinIO的环境变量。在这个示例中,我们设置了MINIO_ROOT_USERMINIO_ROOT_PASSWORD来指定MinIO的根用户的用户名和密码。你可以根据需要进行更改。

  3. 最后,command部分指定了MinIO容器启动时运行的命令,这里是server /data,它告诉MinIO在/data目录下存储数据。

将上述内容保存到名为docker-compose.yml的文件中,并在该文件所在的目录中运行以下命令启动MinIO容器:

# 后台启动
docker-compose up -d
# docker-compose logs  yml里面的服务id     # 查看容器输出日志
docker-compose logs minio

2.3 访问 UI 界面

使用浏览器访问 http://127.0.0.1:9001 地址,访问 MinIO 内置的 UI 界面。

输入账号 admin,密码 admin123进行登录,成功进入首页。

image-20230713155304496

2.4 新建存储桶

点击 [Create Bucket] 按钮,新建一个 Bucket 存储桶,用于稍后文件的上传。

image-20230713155427660

2.5 添加 readonly 访问规则

默认配置下,访问存储桶是需要请求授权的。但是在实际场景下,我们往往希望允许直接访问,此时就需要添加一条 readonly 访问规则。

① 点击右上角的 [Configure Bucket] 设置图标,然后选择 [Access Rules] 菜单。

image-20230713155750204

2.6 上传文件

点击 [Upload] 按钮,点击 [Upload File] 选项,选择一个图片上传。

image-20230713163443915

2.7 访问文件

文件的访问地址的格式为 <http://127.0.0.1:9000/{bucket}/{name}>,注意是 9000 端口。

我们刚上传的文件 {bucket} 是 llp,{name} 是 123.png,所以最终的访问路径是 http://127.0.0.1:9000/llp/123.png。

3.Springboot整合minio

3.1引入依赖

	<dependencies>
		<!-- 实现对 Spring MVC 的自动化配置 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- MinIO 客户端 -->
		<dependency>
			<groupId>io.minio</groupId>
			<artifactId>minio</artifactId>
			<version>8.2.2</version>
		</dependency>
	</dependencies>

3.2 Minio配置类

import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MinIOConfiguration {

    /**
     * Minio 配置
     * @return
     */
    @Bean
    public MinioClient minioClient() {
        // 创建 MinioClient 客户端
        return MinioClient.builder()
                .endpoint(MinioProperties.ENDPOINT)
                .credentials(MinioProperties.ACCESS_KEY, MinioProperties.SECRET_KEY)
                .build();
    }

}

application.yml

minio:
  # minio访问地址
  endpoint: http://192.168.233.202:9000
  # 创建的桶名
  bucket: llp
  # minio账户名
  accessKey: admin
  # minio账户密码
  secretKey: admin123

spring:
  servlet:
    # 文件上传相关配置项
    multipart:
      max-file-size: 16MB # 单个文件大小
      max-request-size: 32MB # 设置总上传的文件大小

MinioProperties读取yml配置

import lombok.Data;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


@Data
@Component
@ConfigurationProperties(value = "minio")
public class MinioProperties implements InitializingBean {
    private String endpoint;
    private String bucket;
    private String accessKey;
    private String secretKey;

    public static String ENDPOINT;
    public static String BUCKET;
    public static String ACCESS_KEY;
    public static String SECRET_KEY;

    @Override
    public void afterPropertiesSet() throws Exception {
        ENDPOINT = endpoint;
        BUCKET = bucket;
        SECRET_KEY = secretKey;
        ACCESS_KEY = accessKey;
    }

}

测试类

@RestController
@RequestMapping("/file")
public class FileController {

    @Resource
    private MinioClient minioClient;

    /**
     * 上传文件
     */
    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) throws Exception {
        // 上传
        String path = UUID.randomUUID().toString(); // 文件名,使用 UUID 随机
        minioClient.putObject(PutObjectArgs.builder()
                .bucket(MinioProperties.BUCKET) // 存储桶
                .object(path) // 文件名
                .stream(file.getInputStream(), file.getSize(), -1) // 文件内容
                .contentType(file.getContentType()) // 文件类型
                .build());
        // 拼接路径
        return String.format("%s/%s/%s", MinioProperties.ENDPOINT, MinioProperties.BUCKET, path);
    }

    /**
     * 删除文件
     */
    @DeleteMapping("/delete")
    public String delete(@RequestParam("path") String path) throws Exception {
        minioClient.removeObject(RemoveObjectArgs.builder()
                .bucket(MinioProperties.BUCKET) // 存储桶
                .object(path) // 文件名
                .build());
        return "success";
    }

}

4.测试

文件上传测试

image-20230713170016575

上传成功后,我们获得了文件的访问 URL 地址,可以使用浏览器直接访问。

http://192.168.233.202:9000/llp/8028e9c9-8b22-4a57-bcdc-74eb96a585da

image-20230713170036947

同时在minio后台也可以看到上传的文件

image-20230713170316851

文件删除测试

image-20230713170805100

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

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

相关文章

园区能源控制管理系统

园区能源控制管理系统是一种能够实现对园区内能源消耗、供应和分配进行实时监控、管理和控制的系统。该系统通过对园区内各种能源设备的数据采集、处理和分析&#xff0c;为管理者提供实时的能源使用情况和数据分析&#xff0c;从而帮助管理者制定科学的能源管理策略和节能措施…

《向量数据库指南》——传统数据库上的向量搜索插件

传统数据库上的向量搜索插件 很好,现在我们已经知道了向量搜索库和向量数据库之间的区别,下面让我们来看看向量数据库与向量搜索插件有何不同。 很多传统关系型数据库和搜索系统,如 ClickHouse 和 Elasticsearch,都包含内置的向量搜索插件。例如,Elasticsearch 8.0 包…

疫情数据微处理——Numpy实战

注&#xff1a;文章内容参考了莫烦python 一、数据来源 数据来自于Kaggle公开免费数据集&#xff0c;需要的伙伴可以自行到这里下载。 二、展示数据 我们用一个字典存储csv数据的第一行、每一行开头的日期以及除了这两者外的数据。 import csv import numpy as npwith ope…

2023年7月13日,Stream流,Stream流的获取,Stream流中间聚合操作,Stream流终结操作,Calendar时间日期类,包装类

Stream流 1. 单列集合的Stream流获取 Java中的Stream流操作可以分为中间操作和终止操作两种。 中间操作包括&#xff1a; filter&#xff1a;对流中的元素进行筛选。map&#xff1a;对流中的元素进行转换。flatMap&#xff1a;对流中的元素进行扁平化映射。distinct&#x…

重启Oracle数据库

root 用户登录服务器。 1、 以oracle身份登录数据库&#xff0c;命令&#xff1a;su - oracle 2、 进入Sqlplus控制台&#xff0c;命令&#xff1a;sqlplus /nolog 3、 以系统管理员登录&#xff0c;命令&#xff1a;connect / as sysdba可以合并为&#xff1a;sqlplus sys/密码…

Acwing:第 111 场周赛(2023.7.12 C++)

目录 5047. 1序列 题目描述&#xff1a; 实现代码&#xff1a; 5048. 无线网络 题目描述&#xff1a; 实现代码&#xff1a; 二分 贪心 5049. 选人 题目描述&#xff1a; 实现代码&#xff1a; 数学 5047. 1序列 题目描述&#xff1a; 实现代码&#xff1a; #incl…

如何实现浏览器内多个标签页之间的通信?

1、使用 LocalStorage 特点&#xff1a;同域共享存储空间&#xff1b;持久化将数据存储在浏览器&#xff1b;提供事件监听storage变化 实现逻辑&#xff1a; A页面将数据存储在本地。B页面监听storage的变化&#xff0c;同步storage的最新数据&#xff1b; 好处&#xff1a;操…

绘制数据图

读取文件&#xff1a; ( 1960 : 30 64 6 ) (1970 : 24 69 7 ) (1980 : 23 68 9 ) (1990 : 18 70 12) (2000 : 15 68 17 ) (2010 : 13 64 23 ) (2020 : 12 60 28) ( 2030 : 11 59 30 ) ( 2040 : 11 56 33 ) 运行代码&#xff1a; //绘制数据图 #include"std_lib_facil…

2.字体图标

2.1字体图标的产生 字体图标使用场景:主要用于显示网页中通用、常用的一些小图标。 精灵图是有诸多优点的&#xff0c;但是缺点很明显&#xff1a; 1.图片文件比较大 2.图片本身放大和缩小会失真 3.一旦图片制作完毕想要更换非常复杂 字体图标iconfont可以很好的解决以上问题…

Redis特性初识及其安装与配置

目录 1.认识Redis Redis主要特点 主要应用场景 2.MySQL VS NoSQL 3.Redis的安装与配置 redis5的安装 修改配置文件 启动redis 4.Redis客户端 命令行客户端 图形化界面客户端 基于redis的API自行开发客户端 1.认识Redis Redis&#xff08;Remote Dictionary Serve…

Python-Web框架flask使用

目录 1.Web框架 1.1 flask 1.1.1 debug调试 1.1.2 定义参数web服务 获取字符串 ​编辑 1.1.3 html网页渲染 1.13.1 带参数传给网页文件 普通元素 列表元素 字典元素 1.Web框架 1.1 flask python的web框架&#xff0c;目录结构如下&#xff1a; 1.static存放的是css,…

《Linux运维总结:Centos7.6之OpenSSH7.4升级版本至9.3》

一、环境信息 操作系统&#xff1a;Centos7.6.1810 OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 如下图所示&#xff1a; 注意&#xff1a;升级后由于加密算法的区别&#xff0c;低版本的SSH工具可能无法连接&#xff0c;建议改用Xshell7或SecureCRT9.0以上版本。 二、注意事项 1、 …

2023最新版 Navicat 16.2.3安装和试用教程详解:轻松掌握最新版本的数据库管理工具连接Redis

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

kettle开发-Day40-AI分流之case/switch

前言&#xff1a; 前面我们讲到了很多关于数据流的AI方面的介绍&#xff0c;包括自定义组件和算力提升这块的&#xff0c;今天我们来学习一个关于kettle数据分流处理非常重要的组件Switch / Case 。当我们的数据来源于类似日志、csv文件等半结构化数据时&#xff0c;我们需要在…

计算机网络 day6

目录 arp协议 arp病毒\欺骗 arp病毒的运行原理 arp病毒产生的后果&#xff1a; 解决方法&#xff1a; ICMP协议 ICMP用在哪里&#xff1f; ICMP协议数据的封装过程 ​编辑 为什么icmp协议封装好数据后&#xff0c;还要加一个ip包头&#xff0c;再使用ip协议再次进…

【UE4 C++】08-生成抛射物来模拟攻击效果

步骤 新建一个C类&#xff0c;父类为Actor&#xff0c;命名为“ASMagicProjectile” 在“ASMagicProjectile.h”中添加如下代码&#xff1a; 在“ASMagicProjectile.cpp”中添加如下代码&#xff1a; 编译后在虚幻编辑器中新建一个蓝图&#xff0c;选择父类为我们刚创建的C类…

vscode插件开发之终端那些事儿

在开发vscode插件的时候&#xff0c;好几个设计都需要集成终端。 查资料后发现vsocd为开发者提供了丰富的终端API。 结合我自己的需求来展开终端的那些事儿吧&#xff1a; 从treeview中点击触发打开一个终端 无关的代码省略&#xff1a; vscode.window.createTerminal({name…

python+selenium进行cnblog的自动化登录测试

Web登录测试是很常见的测试&#xff0c;手动测试大家再熟悉不过了&#xff0c;那如何进行自动化登录测试呢&#xff01;本文就基于pythonselenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动化登录测试&#xff0c;可提供点参考&#xff01;下面就包括测试代…

有没有好的PC端和移动端都能用的便签app?

生活在快节奏的社会环境中&#xff0c;我们每天都要面对大量的事务。为了更好地管理任务和时间&#xff0c;便签app成为了越来越多人选择的工具。因为&#xff0c;便签app不仅能帮助我们记录并安排日常事务&#xff0c;还可以设置提醒事项&#xff0c;准时发送提醒通知告诉我们…

数学建模——插值算法

概念&#xff1a;数模比赛中&#xff0c;常常需要根据有已知的函数点进行数、模型处理和分析&#xff0c;而有时候现有的数据是极少的&#xff0c;不足以支撑分析的进行&#xff0c;这时就需要使用一些数学的方法&#xff0c;“模拟产生“一些新的但又比较靠谱的值来满足需求&a…