SpringBoot整合Minio

devtools/2024/9/20 1:31:49/ 标签: spring boot, java, minio

1. Minio介绍

1.1 什么是Minio

Minio 是一个基于Apache License v2.0开源协议的对象存储服务。它可以运行在多种操作系统上,包括 Linux 和 Windows 等。

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

Minio官网地址:MinIO | 用于AI的S3 & Kubernetes原生对象存储

Minio官方文档:技术文档

1.2 Minio的特点

1. 简单易用: Minio的安装和配置非常简单,只需要下载并运行相应的二进制文件即可。它提供了一个Web UI,可以通过界面管理存储桶和对象。

2. 可扩展性: Minio可以轻松地扩展到多个节点,以提供高可用性和容错能力。它支持多种部署模式,包括单节点、主从复制和集群等。

3. 高可用性: Minio提供了多种机制来保证数据的可靠性和可用性,包括冗余备份、数据复制和故障转移等。

4. 安全性: Minio提供了多种安全机制来保护数据的机密性和完整性,包括SSL/TLS加密、访问控制和数据加密等。

5. 多语言支持: Minio支持多种编程语言,包括Java、Python、Ruby和Go等。

6. 社区支持: Minio是一个开源项目,拥有庞大的社区支持和贡献者。它的源代码可以在GitHub上获得,并且有一个活跃的邮件列表和论坛。

7. 对象存储: Minio的核心功能是对象存储。它允许用户上传和下载任意数量和大小的对象,并提供了多种API和SDK来访问这些对象。

8. 块存储: Minio还支持块存储,允许用户上传和下载大型文件(例如图像或视频)。块存储是一种快速、高效的方式来处理大型文件。

9. 文件存储: Minio还支持文件存储,允许用户上传和下载单个文件。文件存储是一种简单、快速的方式来处理小型文件。

2. Minio安装

2.1 Windows安装Minio

2.1.1 在D盘创建一个Minio的文件夹,并在里面建两个空的文件夹,一个是bin,一个是data

bin文件夹放下载的exe程序

data文件夹存储文件

2.1.2 下载Minio

下载地址:MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容

2.1.3 把下载好的 minio.exe 放到 2.1.1 创建的 bin 文件夹下

2.1.4 启动Minio

注意:不要双击运行!!!不要双击运行!!!不要双击运行!!!

在bin文件夹下,点击路径输入cmd,回车打开cmd窗口,或者通过命令定位到【D:\Minio\bin】文件夹中,输入下方命令,启动MinIO服务,不需要进行其他操作

.\minio.exe server D:\Minio\data

注意:

  启动后会显示minio的访问地址,默认的用户名和密码。

  关闭窗口将停止minio服务器并结束该过程。

2.1.5 浏览器打开上面地址,输入用户名,密码,进行访问

2.1.6 固定端口访问
.\minio.exe server D:\Minio\data --console-address :9001 --address :9000

客户端端口:--console-address :9001

服务器端口:--address :9000

2.1.7 修改用户名,密码

设置账号(至少3位):setx MINIO_ROOT_USER minioroot

设置密码(至少8位):setx MINIO_ROOT_PASSWORD minioroot

setx MINIO_ROOT_USER minioroot
setx MINIO_ROOT_PASSWORD minioroot

2.18 创建 bat 启动文件

创建 runMinio.txt,复制下面的命令保存,修改文件名 runMinio.bat

cmd /c "cd /d D:\Minio\bin&& .\minio.exe server D:\Minio\data
cmd /c "cd /d D:\Minio\bin&& .\minio.exe server D:\Minio\data --console-address :9001 --address :9000

下面的命令存后,双击运行,cmd窗口只是一闪而过,会加到服务里面

打开任务管理器,会发现minio服务是启动的,但是原来的cmd窗口已经被隐藏了

@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
cmd /c "cd /d D:\Minio\bin&& .\minio.exe server D:\Minio\data
@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
cmd /c "cd /d D:\Minio\bin&& .\minio.exe server D:\Minio\data --console-address :9001 --address :9000

2.2 Linux安装Minio

2.2.1 在 home 路径下面创建 Minio 文件夹

2.2.2 下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio

2.2.3 添加执行权限给MinIO文件
chmod +x minio

2.2.4 在 home/Minio下面创建 data 文件夹,做为文件存储路径

2.2.5 启动
./minio server /home/Minio/data
./minio.exe server /home/Minio/data --console-address :9001 --address :9000

后台执行

nohup /home/Minio/minio server /home/Minio/data --console-address :9001 --address :9000 > /dev/null 2>&1 &

2.3 创建 Bucket

2.3 创建 Access Key

3. Springboot接入Minio

3.1 创建Springboot项目

3.2 pom文件添加依赖

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

3.3 application.yml添加配置

#minio配置(下面四个都要替换成自己的)
minio:access-key: li5fasdfaeWFR344W2secret-key: p4VIZ23948ASDFJAjasdif2UFSDFc9burl: http://169.254.19.42:9000bucket-name: file

3.4 编写MinioConfig配置类

package com.minio.config;import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {private String accessKey;private String secretKey;private String url;private String bucketName;@Beanpublic MinioClient minioClient(){return MinioClient.builder().region("cn-north-1").endpoint(url).credentials(accessKey,secretKey).build();}
}

3.5 编写MinioUtil工具类

package com.minio.utils;import com.minio.config.MinioConfig;
import io.minio.*;
import io.minio.http.Method;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;import java.net.URLEncoder;
import java.util.concurrent.TimeUnit;@Component
public class MinioUtil {@Autowiredprivate MinioClient minioClient;@Autowiredprivate MinioConfig configuration;/*** 判断bucket是否存在,不存在则创建*/public boolean existBucket(String bucketName) {boolean exists;try {exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if (!exists) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());exists = true;}} catch (Exception e) {e.printStackTrace();exists = false;}return exists;}/*** 删除bucket*/public Boolean removeBucket(String bucketName) {try {minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 上传文件** @param file     文件* @param fileName 文件名称*/public void upload(MultipartFile file, String fileName) {// 使用putObject上传一个文件到存储桶中。try {InputStream inputStream = file.getInputStream();minioClient.putObject(PutObjectArgs.builder().bucket(configuration.getBucketName()).object(fileName).stream(inputStream, file.getSize(), -1).contentType(file.getContentType()).build());} catch (Exception e) {e.printStackTrace();}}/*** 获取文件访问地址(有过期时间)** @param fileName 文件名称* @param time     时间* @param timeUnit 时间单位*/public String getExpireFileUrl(String fileName, int time, TimeUnit timeUnit) {try {return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(configuration.getBucketName()).object(fileName).expiry(time, timeUnit).build());} catch (Exception e) {e.printStackTrace();}return null;}/*** 获取文件访问地址** @param fileName 文件名称*/public String getFileUrl(String fileName) {try {return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(configuration.getBucketName()).object(fileName).build());} catch (Exception e) {e.printStackTrace();}return null;}/*** 下载文件** @param fileName 文件名称*/public void download(HttpServletResponse response, String fileName) {InputStream in = null;try {// 获取对象信息StatObjectResponse stat = minioClient.statObject(StatObjectArgs.builder().bucket(configuration.getBucketName()).object(fileName).build());response.setContentType(stat.contentType());response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));// 文件下载in = minioClient.getObject(GetObjectArgs.builder().bucket(configuration.getBucketName()).object(fileName).build());IOUtils.copy(in, response.getOutputStream());} catch (Exception e) {e.printStackTrace();} finally {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 删除文件** @param fileName 文件名称*/public void delete(String fileName) {try {minioClient.removeObject(RemoveObjectArgs.builder().bucket(configuration.getBucketName()).object(fileName).build());} catch (Exception e) {e.printStackTrace();}}}

3.6 编写UploadController

package com.minio.controller;import com.minio.utils.MinioUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.util.UUID;/*** @author liyh*/
@RestController
@RequestMapping("/api")
public class UploadController {@Autowiredprivate MinioUtil minioUtil;/*** 上传文件*/@PostMapping(value = "/upload")public String uploadReport(MultipartFile[] files) {for (MultipartFile file : files) {String fileName = file.getOriginalFilename();String rename = UUID.randomUUID().toString();minioUtil.upload(file, rename);}return "上传成功";}/*** 预览文件*/@GetMapping("/preview")public String preview(String fileName) {return minioUtil.getFileUrl(fileName);}/*** 下载文件*/@GetMapping("/download")public void download(String fileName, HttpServletResponse response) {minioUtil.download(response, fileName);}/*** 删除文件*/@GetMapping("/delete")public String delete(String fileName) {minioUtil.delete(fileName);return "删除成功";}}

4. 启动项目测试

4.1 上传文件

http://127.0.0.1:8088/api/upload

4.2 预览文件

http://127.0.0.1:8088/api/preview?fileName=

4.3 下载文件

http://127.0.0.1:8088/api/download?fileName=

4.4 删除文件

http://127.0.0.1:8088/api/delete?fileName=

5. 完整项目地址(Gitee)


http://www.ppmy.cn/devtools/92216.html

相关文章

Linux嵌入式学习——C++学习(2)

一、标识符的作用域和可见性 &#xff08;一&#xff09;作用域 1、全局作用域 在函数外部声明的变量和函数具有全局作用域。这些变量和函数在程序的任何地方都可以被访问。 2.局部作用域 在函数内部、循环体内部或条件语句内部声明的变量具有局部作用域。这些变量只能在其…

RCE下的一些奇技淫巧

文章目录 EVAL长度限制突破技巧限制16字符\$_GET[1]\file_put_contentsusort(...$_GET); 限制7字符 EVAL长度限制突破技巧 限制16字符 PHP Eval函数参数限制在16个字符的情况下&#xff0c;如何拿到Webshell&#xff1f; <?php $param $_REQUEST[param]; If ( strlen($…

秒懂C++之多态

目录 一. 多态的概念 二. 多态的定义及实现 多态的构成条件 虚函数重写的例外 协变(基类与派生类虚函数返回值类型不同) 析构函数的重写(基类与派生类析构函数的名字不同) 练习例题 final override 重载、覆盖(重写)、隐藏(重定义)的对比 三. 抽象类 四. 多态的原理…

haproxy基础

目录 1 HAProxy介绍 1.1 版本对比 1.2 HAProxy功能 2 参数介绍与实践 2.1 global参数说明 2.2 真实代码格式实例 2.3 常用全局参数 2.3.1 nbproc -- 开启几个进程 2.3.2 cpu-map(CUP绑定) 2.3.3 nbthread 2 --开启2个线程 3 Proxies配置 3.1 Proxies配置-defaults 3.2 Proxi…

C语言项目——贪吃蛇,为什么用curses,定义上下左右

在Linux系统中&#xff0c;使用ncurses在程序编译时还要加上 -lcurses 即&#xff1a;gcc cursedemo.c -lcurses #include<curses.h> int main() {initscr(); //ncurse界面的初始化函数printw("This is a curses window.\n");//再ncurse模式下的printfgetc…

solidity 以太坊(Ether) 单位(很基础)

一个字面常数可以带一个后缀 wei&#xff0c; gwei 或 ether 来指定一个以太坊的数量&#xff0c; 其中没有后缀的以太数字被认为单位是wei。 在以太坊和许多其他基于以太坊的区块链系统中&#xff0c;以太币&#xff08;Ether&#xff09;是网络中的主要加密货币。 以太可以被…

Stable Diffusion绘画 | 图生图-涂鸦重绘

涂鸦重绘的整体参数配置&#xff0c;与局部重绘基本一致&#xff0c;仅多了一个蒙版透明度的参数。 都是对局部区域进行重新绘制&#xff0c;但它不仅能识别蒙版的区域&#xff0c;同时还能识别画笔颜色。 例如&#xff0c;对图片中的人物脸部&#xff0c;使用蓝色的画笔&…

JDK8优化JVM总结

JDK8优化JVM总结 默认垃圾回收器&#xff1a; 当前大多数应用仍然使用JDK 1.8&#xff0c;并且默认的年轻代垃圾回收器是Parallel Scavenge。Parallel Scavenge回收器旨在最大化吞吐量&#xff0c;适合对CPU使用率有较高要求的应用场景。 AdaptiveSizePolicy&#xff1a; 默认…

如何在linux系统上部署Redis

<1>简介 Redis 全称 Remote Dictionary Server&#xff08;远程字典服务器&#xff09;&#xff0c;是一个高性能的(key/value)分布式内存数据库&#xff0c;基于内存运行并支持持久化的NoSQL数据库&#xff0c;是当前最热门的NoSql数据库之一,也被人们称为数据结构服务…

SpringBoot依赖之H2 Database(一)

基本概念介绍 H2 Database 依赖名称: H2 Database 功能描述: Provides a fast in-memory database that supports JDBC API and R2DBC access, with a small (2mb) footprint. Supports embedded and server modes as well as a browser based console application. 提供支持…

ptrade排坑笔记——get_price函数在早上8点10分获取不了上一交易日的数据

前言 今天想要和大家分享的是使用get_price函数&#xff0c;但是却没有办法获取上一个交易日的一个交易数据&#xff0c;发生时间点是在早上的8点10分&#xff01; 一、问题描述 就和前言中的一样&#xff0c;在8点10分的时候&#xff0c;使用get_price函数&#xff0c;但是…

Spring配置

1.Spring的两大核心思想IOC和AOP思想 1.1类注解 1.Controller, Service, Configuration, Component, Repository 1.2方法注解 bean&#xff08;这个方法搭配上面的五大注解进行使用&#xff09; 2.Bean的名称 2.1.类注解名称 &#xff08;1&#xff09;默认首字母小写驼…

演示:基于WPF的DrawingVisual开发GS(2019)1822号矢量中国地图一

一、目的&#xff1a;基于WPF的DrawingVisual开发的矢量地图 二、预览 默认样式 深黑样式 深蓝色样式 深蓝色透明样式 演示&#xff1a;基于WPF的DrawingVisual开发GS(2019)1822号矢量中国地图二-CSDN博客VS2022&#xff0c;net7演示&#xff1a;基于WPF的DrawingVisual开发GS…

Codeforces Round 964 (Div. 4) (A~G1)

文章目录 题目链接写在前面A- AB Again?思路code B- Card Game思路code C- Showering思路code D- Slavics Exam思路 E- Triple Operations思路code F- Expected Median思路code G1- Ruler (easy version)思路code 题目链接 点击这里 写在前面 昨天晚上打的这场cf打的跟坨⑩…

C语言经典编程题——基础版1.13

【程序14】 题目&#xff1a;输入某年某月某日&#xff0c;判断这一天是这一年地第几天&#xff1f; #include<stdio.h> int main(){int year,m1,d1,num0;scanf("%d,%d,%d",&year,&m1,&d1);int m1,d1;while(m<m1||d<d1){if(m1||m3||m5||m7…

ASP.Net Core设置接口根路径的方法

使用asp.net core开发微服务项目&#xff0c;需要给每个服务设置不同的根路径&#xff0c;这样既能使用网关转发请求&#xff0c;又方便对单个服务进行测试&#xff0c;保证请求路径的统一。 设置方法需要使用中间件&#xff0c;在Program.cs添加如下代码 app.UsePathBase(&qu…

Using Embeddings API in Azure OpenAI

题意&#xff1a;当我在 Azure OpenAI 中使用嵌入功能时&#xff0c;我遇到了 404 错误&#xff08;资源未找到&#xff09; 问题背景&#xff1a; When I use embeddings with Azure OpenAI I am getting 404 (resource not found): 当我在 Azure OpenAI 中使用嵌入功能时&a…

kafka下载|安装

1、下载kafka https://kafka.apache.org/downloads 2、安装kafka 解压下载的kafka安装包即可 tar -xvf kafka_2.13-3.7.0.tgz -C /usr/local/3、查看kafka目录 bin目录&#xff1a;存放了脚本 config目录&#xff1a;主要存放了配置文件

Java语言程序设计——篇十三(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

Docker快速入门指南

&#x1f6e0;️ Docker 应用场景 Docker 是一个开源的平台&#xff0c;旨在简化应用程序的开发、部署和管理。它通过容器技术&#xff0c;将应用及其所有依赖打包在一个标准化的环境中&#xff0c;从而确保应用在不同环境中的一致性和可移植性。在 Python 爬虫的场景中&#…