使用Java Minio搭建自己的文件系统详解
作者:鱼小洲 发布时间:2023-05-20 05:15:01
前言
最近接了一个项目,甲方不愿意买服务器,但是呢,项目又必须要用文件功能。所以很巧,最近又刚好看到了Minio这个牛逼的工具。正好借此机会记录下来此次操作的全部流程。
本次涉及到的功能有:
Minio的安装与启动
控制台的使用以及存储桶的创建
存储桶的使用权限说明
使用控制台实现文件上传与下载
(重点)使用Springboot与Minio整合实现文件的增删改查
本次使用环境:Centos7.6+finalshell+java
1、Minio介绍
如果你听过这个,那么你直接跳到第二小节看使用说明。如果你不知道这个,但是你最近也正在找一款文件存储的工具,那么你可以先看看这个的介绍。
Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。区别于分布式存储系统,minio的特色在于简单、轻量级,对开发者友好。
阿里云对象存储你应该清楚,这个和OSS的区别就是,OSS收费,这个是你自己搭建的,不收费,只占磁盘大小。其他的功能都是一毛一样的。
2、Minio安装与启动
首先,我们得先去找到下载地址
下载地址:
https://dl.min.io/server/minio/release/linux-amd64/minio
使用我们的终端工具连接上我们的服务器。
步骤:
1.找一个目录,用来存放我们的minio文件
2.使用wget命令,通过下载地址下载下载我们的文件
wget https://dl.min.io/server/minio/release/linux-amd64/minio
3.给minio这个文件赋予权限,作为文件启动
chmod +x minio
4.使用./minio server start
启动
当你能看到这个界面的时候,说明你就成功了。
小提示1:
下面的两个红色的并不是报错,而是警告,也可以是一个建议。
第一句翻译:控制台断点的侦听端口并不是固定的,请使用 --console-address指定端口启动
第二句翻译:默认初始凭证账号和密码是minioadmin和minioadmin 你可以在环境变量中去更改他。但是我这儿就不修改了,如果你想修改你可以去profile下面使用export命名来加上他说的那个变量名来指定账号和密码。
小提示2:
如果你是本地虚拟机,启动后只需要使用ip:9000端口来实现访问,如果访问不了,请关掉防火墙,命令:
systemctl stop firewalld
如果你是云服务器,请放行9000端口和他提示出来的端口。9000作为API端口是不变的,但是你同样可以指定修改他,控制台端口经过我自己测试,他每次启动都会发生改变,所以我们还是建议使用指定端口启动。
小提示3:
我们上面的启动命令,他启动好了之后日志可以指定到目录去存储,只需要将./minio server start 命令更换成 ./minio server /home/minio/data 其中/home/minio/data是我自己定义的目录,你可以随便定义。
第二:启动后会占用控制台,我们也可以将他调整成为后台启动,加上指定的端口,我们就可以完成自定义的设置。具体启动命令如下:nohup ./minio server --console-address ':41169' /home/minio/data/ > /home/minio/data/minio.log 2>&1 &
意思就是,指定控制台端口为41169,并且生成日志文件到/home/minio/data目录下的minio.log中
访问ip:9000进入登录界面 使用默认账号进行登录
3、Minio控制台创建存储桶
这样就创建好了我们的存储桶。
4、存储桶权限
在创建好存储桶之后,我们为了使用远程连接来访问使用。所以有必要去修改一下存储桶的权限。
我们点击最下面的那个Rules,然后点击右上角创建一个访问规则。可以使用精准匹配,也可以使用通配符。
前缀我们使用* 这样可以匹配全部访问用户,下面的权限我们使用读写。
5、控制台实现文件的上传与下载
我们点到左边的功能栏,然后选择右边我们刚创建的存储桶。然后,,我觉得接下来的操作我都不用细说你们应该都会玩了。
同样,在上传成功后,也提供下载与预览功能。
6、使用Springboot与Minio整合实现文件的增删查改
6.1、创建项目
略
6.2、添加依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>6.0.11</version>
</dependency>
6.3、创建自定义属性与配置类
minio:
accesskey: minioadmin
secretkey: minioadmin
url: http://ip:9000
bucketname: zxy-images
@Component
@Data
public class MinioProperties {
/**
* API调用地址
*/
@Value("${minio.url}")
private String url;
/**
* 连接账号
*/
@Value("${minio.accesskey}")
private String accessKey;
/**
* 连接秘钥
*/
@Value("${minio.secretkey}")
private String secretKey;
}
@Configuration
@Slf4j
public class MinioConfig {
@Resource
private MinioProperties minioProperties;
@Bean
public MinioClient getMinioClient(){
try {
return new MinioClient(minioProperties.getUrl(), minioProperties.getAccessKey(), minioProperties.getSecretKey());
} catch (InvalidEndpointException | InvalidPortException e) {
e.printStackTrace();
log.info("-----创建Minio客户端失败-----");
return null;
}
}
}
6.4、功能实现
6.4.1、文件上传
public void upload(MultipartFile file) throws IOException, XmlPullParserException, NoSuchAlgorithmException, InvalidKeyException, InvalidArgumentException, InvalidResponseException, InternalException, NoResponseException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException {
if (file == null || file.getSize() == 0 || file.isEmpty()) {
throw new RuntimeException("上传文件为空,请重新上传");
}
// 获取文件名
String filename = file.getOriginalFilename();
assert filename != null;
/* 像下面这样写最主要是为了用来做分割,同时也保证文件名是唯一的 */
String newFilename = UUID.randomUUID().toString() + "|" + filename + filename.substring(filename.lastIndexOf("."));
minioClient.putObject(bucketName, newFilename, file.getInputStream(), file.getSize(), null, null, file.getContentType());
}
6.4.2、文件下载
public InputStream download(String fileName, HttpServletResponse response) {
InputStream inputStream = null;
// 根据文件名拿到minio中的文件对象
try {
ObjectStat object = minioClient.statObject(bucketName, fileName);
// 设置响应头类型
response.setContentType(object.contentType());
inputStream = minioClient.getObject(bucketName, fileName);
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
6.4.3、查询全部文件
public Iterable<Result<Item>> listObjects() {
try {
return minioClient.listObjects(bucketName);
} catch (XmlPullParserException e) {
e.printStackTrace();
}
return null;
}
6.4.4、删除指定文件
public void deleteFile(String fileName){
try {
minioClient.removeObject(bucketName,fileName);
} catch (Exception e) {
e.printStackTrace();
}
}
来源:https://blog.csdn.net/weixin_43581288/article/details/120237446


猜你喜欢
- 页面:上传文件时的关键词:enctype="multipart/form-data"<%@ page langua
- Chart控件可以用来绘制波形图、柱状图、饼图、折线图等,用来进行数据表现是很不错的简单说一下这个控件的使用方法效果图我们首先要加载Char
- 调试的时候,在循环里增加条件判断,可以极大的提高效率,心情也能愉悦。以下介绍下IDEA使用条件【Condition】断点的方法1、编写一段样
- Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。
- 使用字符时,我们通常使用的是内置数据类型char。实例char ch = 'a';// Unicode for upperc
- jdk中自带了很多工具可以用于性能分析,位于jdk的bin目录下,jvisualvm工具可以以图形化的方式更加直观的监控本地以及远程的jav
- 本文实例讲述了C#实现对二维数组排序的方法。分享给大家供大家参考。具体实现方法如下:/// <summary>/// A gen
- 译文链接:https://www.infoworld.com/art...C# 在 3.0 版本中提供了对 扩展方法 的支持,扩展方法常用于
- 其中定义WIFI AP的几个状态public static final int WIFI_AP_STATE_DISABLING = 10;
- 一、检查数组是否包含某个值的方法使用Listpublic static boolean useList(String[] arr, Stri
- 查询返回Map<String,Object>类型mybatis 查询返回Map<String,Object> 类型,
- @CompentScan excludeFilters配置无效@CompentScan 注解配置需要扫描的包excludeFilters 是
- jdk8之前 一、java.lang.Systemlong times = System.currentTimeMillis();
- 本文实例为大家分享了winform实现五子棋游戏的具体代码,供大家参考,具体内容如下利用数组,根据新旧数组值的不同,获取那个点是什么棋子;说
- 6.0的手机对于写入手机需要申请权限的我做了如下处理下面我贴出代码package com.example.admin.sdapplicati
- 一个围绕统计分析功能的系统,在最后制作统计分析时需要一个批量点击的功能,用以批量制作echarts图形后生成图片并保存图形和图片。方便后续导
- 导语相信大家无论是做前端还是做后端的,都被接口接口文档所折磨过,前端抱怨接口文档和后端给的不一致,后端抱怨写接口文档很麻烦,所以Swagge
- 本文实例讲述了android从资源文件中读取文件流并显示的方法。分享给大家供大家参考。具体如下:在android中,假如有的文本文件,比如T
- 引入假定我们有两个项目:Cup 和 Water,其中 Cup 表示主项目,而 Water 表示子模块项目。其中 Cup 的远程仓库地址为 g
- 简单工厂模式:由一个工厂对象决定创建出哪一种类的实例。1.抽象类public abstract class People { p