使用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;以更精确的描述硬件的行为。下面这些情…

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

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

Linux高级编程——线程

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

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…

uniapp开发企业微信内部应用

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

06 Shell编程实战——案例1

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

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…

基于java语言+springboot技术架构开发的 互联网智能3D导诊系统源码支持微信小程序、APP 医院AI智能导诊系统源码

基于java语言springboot技术架构开发的 互联网智能3D导诊系统源码支持微信小程序、APP 医院AI智能导诊系统源码 一、智慧导诊系统开发原理 导诊系统从原理上大致可分为基于规则模板和基于数据模型两类。 1、基于规则推理的方法通过人工建立症状、疾病和科室之间的对应规则实现…

【51单片机入门】点亮数码管

文章目录 前言仿真图如何去绘制一个数字示例代码选择某个数码管显示某个数字 示例代码总结 前言 在嵌入式系统的世界中&#xff0c;单片机扮演着至关重要的角色。51单片机&#xff0c;作为最早的微控制器之一&#xff0c;至今仍被广泛应用在各种设备中。本文将介绍如何使用51单…

js或ts中对象如何循环遍历获取名字和值

数组循环有多种方法&#xff0c;但是对象循环还是会遇到一些问题 分开获取key或value let names{name:kaka,age:12}获取key值代码&#xff1a; Object.keys(names).forEach(name>{console.log(name) })结果&#xff1a; 获取value值代码&#xff1a; Object.values(name…

多地高温持续“热力”爆表 约克VRF中央空调带你清凉舒爽一夏

“出门5分钟&#xff0c;流汗2小时”,夏季高温天气&#xff0c;怎一个“热”字了得&#xff1f;6月以来&#xff0c;我国多地迎来高温“炙烤”&#xff0c;全国出现40℃以上高温的范围持续增加&#xff0c;随着中央气象台高温预警持续拉响&#xff0c;人们都很纳闷&#xff1a;…

Android 大话binder通信

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章 由于 Android 大话binder通信(上) 和 Android 大话binder通信(下) 分为两篇阅读体验不好&#xff0c;顾合并为一篇。 本文摘要 用故事的方式把binder通信的整个过程都描述…

TFMath Caculator:一个简单的Java AWT计算器

目录 背景&#xff1a; 代码展示: 代码解析: 输出结果: 总结: 背景&#xff1a; 使用Java AWT(Abstract Window Toolkit)库创建的简单计算器应用-TFMath Calculator。这个计算器允许用户输入两个数字&#xff0c;点击号按钮后&#xff0c;计算器会计算这两个数字的和&…

计算机网络之OSI七层体系结构

目录 1.物理层 1.1物理层组成 1.2物理层功能 1.3物理层服务 1.4物理层标准 1.5物理层接口 2.数据链路层 2.1基于物理层的问题 2.2数据链路层功能 2.3数据链路层服务 2.4数据链路层协议 3.网络层 3.1基于DL层的问题 3.2网络层功能 3.3网络层服务 3.4网络层协议 …

怎么加快音频播放速度?加快音频播放器的四种方法介绍

怎么加快音频播放速度&#xff1f;许多音乐爱好者对各种类型的歌曲充满了热情&#xff0c;这些歌曲节奏轻快或者缓慢不一&#xff0c;但通常默认的播放速度都是一倍速。有时候&#xff0c;一些旋律悠扬的曲子可能听起来有些慢&#xff0c;这时候一些朋友可能想要尝试加快节奏&a…

鸿蒙开发 之 健康App案例

1.项目介绍 该项目是记录用户日常饮食情况&#xff0c;以及针对不同食物摄入营养不同会有对应的营养摄入情况和日常运动消耗情况&#xff0c;用户可以自己添加食品以及对应的热量。 1.1登陆页 1.2饮食统计页 1.3 食物列表页 2.登陆页 2.1自定义弹框 import preferences from oh…

IP地址查询和代理服务器:双重保护隐私

随着网络应用的日益普及&#xff0c;我们的个人信息和数据安全面临前所未有的挑战。在此背景下&#xff0c;IP地址查询和代理服务器成为保护个人隐私和网络安全的两大关键工具。本文将从IP地址查询的原理和应用出发&#xff0c;深入剖析代理服务器在网络隐私保护中的作用&#…

AI视频教程下载-数据分析中的提示工程:Python、Pandas、ChatGPT

Prompt Engineering for Data Analysis Python, Pandas, ChatGPT ChatGPT与Python&#xff1a;无需编程。借助ChatGPT、Python、Pandas及提示工程进行数据分析与数据可视化 "利用Python、Pandas和ChatGPT进行数据分析的提示工程"是一门开创性的课程&#xff0c;它通…

SpringBoot(二)SpringBoot多环境配置

Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot&#xff08;一&#xff09;创建一个简单的SpringBoot工程 SpringBoot&#xff08;二&#xff09;SpringBoot多环境配置 SpringBoot&#xff08;三&#xff09;SpringBoot整合MyBatis SpringBoot&#xff08;四…