使用minio搭建oss

文章目录

    • 1.minio安装
        • 1.拉取镜像
        • 2.启动容器
        • 3.开启端口
          • 1.9090端口
          • 2.9000端口
        • 4.访问
          • 1.网址http://:9090/
        • 5.创建一个桶
    • 2.minio文件服务基本环境搭建
        • 1.创建一个文件模块
        • 2.目录结构
        • 3.配置依赖
        • 3.application.yml 配置
        • 4.编写配置类MinioConfig.java,构建minioClient
        • 5.FileInfo.java 封装文件信息
        • 6.MinioUtil.java 文件工具类
        • 7.FileController.java 测试
        • 8.启动类 OssApplication.java
        • 9.启动测试
    • 3.传统模式
        • 1.目录结构和类图
        • 2.首先引入Lombok的依赖,使用@SneakyThrows注解抛出异常
        • 3.StorageService.java 存储的接口
        • 4.MinioStorageServiceImpl.java minio实现的接口
        • 5.如果有其他的服务比如阿里云也可以实现接口
        • 6.FileController.java 按照id来依赖注入进行调用
        • 7.测试
        • 8.缺点分析
    • 4.使用适配器模式优化
        • 1.类图
        • 2.新增一个阿里云的实现类 AliyunStorageServiceImpl.java
        • 3.抽取一个 FileService.java 构造器聚合接口
        • 4.StorageConfig.java 配置文件根据application.yml来给构造器注入不同的对象
        • 5.application.yml 指定要使用的oss
        • 6.FileController.java 组合一个FileService调用里面的方法
        • 7.测试

1.minio安装

1.拉取镜像
docker pull minio/minio

image-20240531085604926

2.启动容器
docker run -p 9000:9000 -p 9090:9090 \--name minio \-d --restart=always \-e "MINIO_ACCESS_KEY=" \-e "MINIO_SECRET_KEY=" \-v /mydata/minio/data:/data \minio/minio server \/data --console-address ":9090" -address ":9000"
3.开启端口
1.9090端口
systemctl start firewalld && firewall-cmd --permanent --add-port=9090/tcp && firewall-cmd --reload && firewall-cmd --query-port=9090/tcp

image-20240531090338979

2.9000端口
systemctl start firewalld && firewall-cmd --permanent --add-port=9000/tcp && firewall-cmd --reload && firewall-cmd --query-port=9000/tcp

image-20240531095156302

4.访问
1.网址http://:9090/
5.创建一个桶

image-20240531090828470

2.minio文件服务基本环境搭建

1.创建一个文件模块

image-20240531091221636

2.目录结构

image-20240531095613468

3.配置依赖
<!-- maven的配置 -->
<!-- 解决java: -source 1.5 中不支持 diamond 运算符 问题 -->
<properties><java.version>1.8</java.version><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target>
</properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.4.2</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.4.2</version><exclusions><exclusion><artifactId>spring-boot-starter-logging</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency><!-- minio依赖 --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.0</version></dependency>
</dependencies><!-- 配置阿里云仓库 -->
<repositories><repository><id>central</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><layout>default</layout><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository>
</repositories><!-- maven打包常规配置 -->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
3.application.yml 配置
server:port: 4000
minio:url: http://:9000accessKey: secretKey: 
4.编写配置类MinioConfig.java,构建minioClient
package com.sunxiansheng.oss.config;import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Description: minio配置管理* @Author sun* @Create 2024/5/31 9:22* @Version 1.0*/
@Configuration
public class MinioConfig {// minioUrl@Value("${minio.url}")private String url;// minio用户名@Value("${minio.accessKey}")private String accessKey;// minio密码@Value("${minio.secretKey}")private String secretKey;/*** 构造minioClient*/@Beanpublic MinioClient getMinioClient() {return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();}}
5.FileInfo.java 封装文件信息
package com.sunxiansheng.oss.entity;/*** Description:* @Author sun* @Create 2024/5/31 9:47* @Version 1.0*/
public class FileInfo {private String fileName;private Boolean directoryFlag;private String etag;public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public Boolean getDirectoryFlag() {return directoryFlag;}public void setDirectoryFlag(Boolean directoryFlag) {this.directoryFlag = directoryFlag;}public String getEtag() {return etag;}public void setEtag(String etag) {this.etag = etag;}
}
6.MinioUtil.java 文件工具类
package com.sunxiansheng.oss.util;import com.sunxiansheng.oss.entity.FileInfo;
import io.minio.*;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;/*** Description: minio文件操作工具* @Author sun* @Create 2024/5/31 9:30* @Version 1.0*/
@Component
public class MinioUtil {@Resourceprivate MinioClient minioClient;/*** 创建bucket桶*/public void createBucket(String bucket) throws Exception {boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());if (!exists) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());}}/*** 上传文件*/public void uploadFile(InputStream inputStream, String bucket, String objectName) throws Exception {minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName).stream(inputStream, -1, Integer.MAX_VALUE).build());}/*** 列出所有桶*/public List<String> getAllBucket() throws Exception {List<Bucket> buckets = minioClient.listBuckets();return buckets.stream().map(Bucket::name).collect(Collectors.toList());}/*** 列出当前桶及文件*/public List<FileInfo> getAllFile(String bucket) throws Exception {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucket).build());List<FileInfo> fileInfoList = new LinkedList<>();for (Result<Item> result : results) {FileInfo fileInfo = new FileInfo();Item item = result.get();fileInfo.setFileName(item.objectName());fileInfo.setDirectoryFlag(item.isDir());fileInfo.setEtag(item.etag());fileInfoList.add(fileInfo);}return fileInfoList;}/*** 下载文件*/public InputStream downLoad(String bucket, String objectName) throws Exception {return minioClient.getObject(GetObjectArgs.builder().bucket(bucket).object(objectName).build());}/*** 删除桶*/public void deleteBucket(String bucket) throws Exception {minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());}/*** 删除文件*/public void deleteObject(String bucket, String objectName) throws Exception {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build());}}
7.FileController.java 测试
package com.sunxiansheng.oss.controller;import com.sunxiansheng.oss.util.MinioUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;/*** Description:* @Author sun* @Create 2024/5/31 9:53* @Version 1.0*/
@RestController
public class FileController {@Resourceprivate MinioUtil minioUtil;@RequestMapping("/testGetAllBuckets")public String testGetAllBuckets() throws Exception {List<String> allBucket = minioUtil.getAllBucket();return allBucket.get(0);}}
8.启动类 OssApplication.java
package com.sunxiansheng.oss;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;/*** Description:* @Author sun* @Create 2024/5/31 9:20* @Version 1.0*/
@SpringBootApplication
@ComponentScan("com.sunxiansheng")
public class OssApplication {public static void main(String[] args) {SpringApplication.run(OssApplication.class, args);}
}
9.启动测试

image-20240531095956479

image-20240531100012712

3.传统模式

1.目录结构和类图

image-20240531102824619

image-20240531112643283

2.首先引入Lombok的依赖,使用@SneakyThrows注解抛出异常
        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version></dependency>
3.StorageService.java 存储的接口
package com.sunxiansheng.oss.service;import com.sunxiansheng.oss.entity.FileInfo;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;
import java.util.List;/*** Description:* @Author sun* @Create 2024/5/31 10:03* @Version 1.0*/
public interface StorageService {/*** 创建bucket桶*/void createBucket(String bucket);/*** 上传文件*/void uploadFile(MultipartFile uploadFile, String bucket, String objectName);/*** 列出所有桶*/List<String> getAllBucket();/*** 列出当前桶及文件*/List<FileInfo> getAllFile(String bucket);/*** 下载文件*/InputStream downLoad(String bucket, String objectName);/*** 删除桶*/void deleteBucket(String bucket);/*** 删除文件*/void deleteObject(String bucket, String objectName);}
4.MinioStorageServiceImpl.java minio实现的接口
package com.sunxiansheng.oss.service.impl;import com.sunxiansheng.oss.entity.FileInfo;
import com.sunxiansheng.oss.service.StorageService;
import com.sunxiansheng.oss.util.MinioUtil;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.io.InputStream;
import java.util.List;/*** Description:* @Author sun* @Create 2024/5/31 10:06* @Version 1.0*/
@Service("minioStorageServiceImpl")
public class MinioStorageServiceImpl implements StorageService {@Resourceprivate MinioUtil minioUtil;@Override@SneakyThrows // Lombok 自动抛出异常public void createBucket(String bucket) {minioUtil.createBucket(bucket);}@Override@SneakyThrows // Lombok 自动抛出异常public void uploadFile(MultipartFile uploadFile, String bucket, String objectName) {createBucket(bucket);if (objectName != null) {minioUtil.uploadFile(uploadFile.getInputStream(), bucket, objectName + "/" + uploadFile.getName());} else {minioUtil.uploadFile(uploadFile.getInputStream(), bucket, uploadFile.getName());}}@Override@SneakyThrows // Lombok 自动抛出异常public List<String> getAllBucket() {return minioUtil.getAllBucket();}@Override@SneakyThrows // Lombok 自动抛出异常public List<FileInfo> getAllFile(String bucket) {return minioUtil.getAllFile(bucket);}@Override@SneakyThrows // Lombok 自动抛出异常public InputStream downLoad(String bucket, String objectName) {return minioUtil.downLoad(bucket, objectName);}@Override@SneakyThrows // Lombok 自动抛出异常public void deleteBucket(String bucket) {minioUtil.deleteBucket(bucket);}@Override@SneakyThrows // Lombok 自动抛出异常public void deleteObject(String bucket, String objectName) {minioUtil.deleteObject(bucket, objectName);}
}
5.如果有其他的服务比如阿里云也可以实现接口
6.FileController.java 按照id来依赖注入进行调用
package com.sunxiansheng.oss.controller;import com.sunxiansheng.oss.service.StorageService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;/*** Description:* @Author sun* @Create 2024/5/31 9:53* @Version 1.0*/
@RestController
public class FileController {// 这里根据id进行依赖注入,如果还有阿里云的,就注入阿里云的即可@Resourceprivate StorageService minioStorageServiceImpl;@RequestMapping("/listBuckets")public String testGetAllBuckets() throws Exception {List<String> allBucket = minioStorageServiceImpl.getAllBucket();return allBucket.get(0);}}
7.测试

image-20240531103457742

8.缺点分析

如果需要修改为阿里云的,则需要修改注入的id,也就是所有的controller都需要修改

4.使用适配器模式优化

1.类图

image-20240531143453159

2.新增一个阿里云的实现类 AliyunStorageServiceImpl.java
package com.sunxiansheng.oss.service.impl;import com.sunxiansheng.oss.entity.FileInfo;
import com.sunxiansheng.oss.service.StorageService;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** Description:* @Author sun* @Create 2024/5/31 11:13* @Version 1.0*/
@Service("aliyunStorageServiceImpl")
public class AliyunStorageServiceImpl implements StorageService {@Overridepublic void createBucket(String bucket) {}@Overridepublic void uploadFile(MultipartFile uploadFile, String bucket, String objectName) {}@Overridepublic List<String> getAllBucket() {List<String> res = new ArrayList<>();res.add("aliyunBucket");return res;}@Overridepublic List<FileInfo> getAllFile(String bucket) {return Collections.emptyList();}@Overridepublic InputStream downLoad(String bucket, String objectName) {return null;}@Overridepublic void deleteBucket(String bucket) {}@Overridepublic void deleteObject(String bucket, String objectName) {}
}
3.抽取一个 FileService.java 构造器聚合接口
package com.sunxiansheng.oss.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** Description:* @Author sun* @Create 2024/5/31 10:48* @Version 1.0*/
@Service
public class FileService {private final StorageService storageService;@Autowired // 构造器注入,如果只有一个构造器,其实可以不加,会自动识别public FileService(StorageService storageService) {this.storageService = storageService;}/*** 列出所有桶*/public List<String> getAllBucket() {return storageService.getAllBucket();}}
4.StorageConfig.java 配置文件根据application.yml来给构造器注入不同的对象
package com.sunxiansheng.oss.config;import com.sunxiansheng.oss.service.StorageService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;/*** Description:* @Author sun* @Create 2024/5/31 11:10* @Version 1.0*/
@Configuration
public class StorageConfig {@Value("${storage.service.type}")private String storageType;@Resourceprivate StorageService aliyunStorageServiceImpl;@Resourceprivate StorageService minioStorageServiceImpl;@Beanpublic StorageService storageService() {if ("minio".equals(storageType)) {return minioStorageServiceImpl;} else if ("aliyun".equals(storageType)) {return aliyunStorageServiceImpl;} else {throw new IllegalArgumentException("未找到对应的文件存储处理");}}}
5.application.yml 指定要使用的oss
6.FileController.java 组合一个FileService调用里面的方法
package com.sunxiansheng.oss.controller;import com.sunxiansheng.oss.service.FileService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;/*** Description:* @Author sun* @Create 2024/5/31 9:53* @Version 1.0*/
@RestController
public class FileController {// 这里根据id进行依赖注入,如果还有阿里云的,就注入阿里云的即可@Resourceprivate FileService fileService;@RequestMapping("/listBuckets")public String testGetAllBuckets() throws Exception {List<String> allBucket = fileService.getAllBucket();return allBucket.get(0);}}
7.测试

image-20240531143928470

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

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

相关文章

Verilog进行结构描述(四):Verilog逻辑强度(strength)模型

目录 1.Verilog提供多级逻辑强度。2.基本单元强度说明语法3.信号强度值系统4.Verilog多种强度决断 微信公众号获取更多FPGA相关源码&#xff1a; 1.Verilog提供多级逻辑强度。 逻辑强度模型决定信号组合值是可知还是未知的&#xff0c;以更精确的描述硬件的行为。下面这些情…

web自动化(二)元素定位 xpath定位css定位

常用的元素定位&#xff1a;ID&#xff0c;Name,xpath,css 等等 selenuim demo import timefrom selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support imp…

数学建模---最小生成树问题的建模~~~~~Matlab代码

目录 1.相关概念 &#xff08;1&#xff09;什么是树 &#xff08;2&#xff09;生成树和最小生成树&#xff1a; 2.适用赛题 &#xff08;1&#xff09;赛题分类 &#xff08;2&#xff09;不同之处 3.两种算法 &#xff08;1&#xff09;prim算法 &#xff08;2&…

linux 下启动app

创建启动脚本: 创建一个启动脚本,命名为你的应用程序或服务的名称。这个脚本负责启动、停止和管理你的应用程序。你可以使用 sudo 权限和任何文本编辑器创建这个脚本,比如 nano: bash sudo nano /etc/init.d/my_app 在编辑器中输入启动脚本的内容。一个简单的例子可能如下…

java调用海康威视SDK实现车牌识别

我采用的是 报警布防方式 SDK版本为 CH-HCNetSDKV6.1.9.48_build20230410_win32 如何引用dll 我用的是jna 就不描述了 SDK在官网自行下载 以下代码亲测可用 自行参考~ 1.1接口调用流程 虚线框的内容是可选的&#xff0c;设备事先安装配置好&#xff0c;能力集和配置接口可…

Linux高级编程——线程

pthread 线程 概念 &#xff1a;线程是轻量级进程&#xff0c;一般是一个进程中的多个任务。 进程是系统中最小的资源分配单位. 线程是系统中最小的执行单位。 优点&#xff1a; 比多进程节省资源&#xff0c;可以共享变量 进程会占用&am…

【高考】选专业时,应避免的误区

【高考】选专业时&#xff0c;应避免的误区-CSDN博客 【高考】选专业时以什么为主&#xff1f;-CSDN博客 分数限制下&#xff0c;选好专业还是选好学校&#xff1f;-CSDN博客 分数限制下&#xff0c;选好专业还是选好学校&#xff1f;-CSDN博客 在选专业时&#xff0c;考生…

解析 ThreadLocal 原理

ThreadLocal用于线程局部变量的一个工具类。 原理是为每个线程创建独立的变量副本&#xff0c;从而实现线程数据的隔离。具体来说&#xff0c;ThreadLocal 通过一个 ThreadLocalMap来实现&#xff0c;这个 ThreadLocalMap 是一个自定义的哈希表&#xff0c;用于存储线程和对应的…

Qt creator实现一个简单计算器

目录 1 界面设计 2 思路简介 3 代码 目录 1 界面设计 ​2 思路简介 3 代码 3.1 widget.h 3.2 widget.c 4 完整代码 在这里主要记载了如何使用Qt creator完成一个计算器的功能。该计算器可以实现正常的加减乘除以及括号操作&#xff0c;能实现简单的计算器功能。 1 界…

Hadoop版本演变、分布式集群搭建

Hadoop版本演变历史 Hadoop发行版非常的多&#xff0c;有华为发行版、Intel发行版、Cloudera Hadoop(CDH)、Hortonworks Hadoop(HDP)&#xff0c;这些发行版都是基于Apache Hadoop衍生出来的。 目前Hadoop经历了三个大的版本。 hadoop1.x&#xff1a;HDFSMapReduce hadoop2.x…

MySQL学习_python操作MySQL

用python连接数据库分为以下几个步骤 1.首先下载pymysql pip install pymysql2.创建数据 # 1.导入pymysql import pymysql # 2.连接MySQL conn pymysql.connect(host127.0.0.1,port3306,userroot,charsetutf8,dbunicom) cursor conn.cursor(cursorpymysql.cursors.DicCurso…

uniapp开发企业微信内部应用

最近一直忙着开发项目&#xff0c;终于1.0版本开发完成&#xff0c;抽时间自己总结下在项目开发中遇到的技术点。此次项目属于自研产品&#xff0c;公司扩展业务&#xff0c;需要在企业微信中开发内部应用。因为工作中使用的是钉钉&#xff0c;很少使用企业微信&#xff0c;对于…

重新记录做事的方向和内容(2024年6月28日19:50:38)

感觉自己没必要这么焦虑&#xff0c;最后的结果无非就是自己又开始恢复到自己抽烟&#xff0c;喝酒&#xff0c;说脏话的一个状态&#xff0c;自己那么糟糕自己都已经通过实事求是走出来了&#xff0c;现在难道自己还害怕什么&#xff1f; 如果顺着这种封闭和没有断舍离的状态…

【Qt C++实现绘制仪表盘】

要在Qt C中绘制仪表盘&#xff0c;您可以使用QChart、QSeries、QBarSeries、QPointSeries等类。以下是一个简单的示例&#xff0c;演示如何使用这些类创建一个绘图仪表盘&#xff1a; #include <QApplication> #include <QChart> #include <QChartView> #in…

06 Shell编程实战——案例1

脚本编程步骤&#xff1a; 脚本编程一般分为4个步骤&#xff0c;即先确定需求&#xff0c;然后再确定你所要用到的语句&#xff0c; 需求分析&#xff1a;根据系统管理的需求&#xff0c;分析脚本要实现的功能、功能实现的层次、实现的命令与语句等&#xff1b;命令测试&…

Windows11下安装多个JDK版本,并切换

Windows11下安装多个JDK版本,并切换 前言步骤1、前期准备2、版本切换思考前言 一台电脑可以同时安装多个版本 jdk,建议两个,最多不超三个。安装多个JDK版本可能会占用较多的磁盘空间。此外,同时运行多个 JDK 版本可能会对系统性能产生一定的影响。   切换 JDK 有两种方式…

ios swift5 视频播放 播放视频失败 无法播放HEVC (H.265) 格式的视频 H.264格式的可以播放

文章目录 1.问题2.原因&#xff1a;iOS swift AVPlayerViewController无法播放HEVC (H.265) 格式的视频3.解决方法用第三方框架MobileVLCKit来播放4.用MobileVLCKit写的播放器4.1 两个oc版本的4.2 两个swiftUI版本的5.苹果是支持HEVC (H.265) 格式的视频&#xff0c;是硬件那边…

css做旋转星球可举一反三

<!DOCTYPE html> <html lang"en"><head> <meta charset"UTF-8" /> <title>旋转的星球</title> <style type"text/css">.box {/*position: relative;*/position: absolute;width: 139px;height: 139p…

计算文本相似度的几种方法

计算文本相似度的几种方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一下计算文本相似度的几种方法。文本相似度在自然语言处理&#xff08…

算法训练 | 动态规划Part10 | 300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组

目录 300.最长递增子序列 动态规划法 674.最长连续递增序列 动态规划法 718.最长重复子数组 动态规划法 300.最长递增子序列 题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 动态规划法 “子序列是…