使用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启动

使用Java Minio搭建自己的文件系统详解

当你能看到这个界面的时候,说明你就成功了。

小提示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进入登录界面 使用默认账号进行登录

使用Java Minio搭建自己的文件系统详解

使用Java Minio搭建自己的文件系统详解

3、Minio控制台创建存储桶

使用Java Minio搭建自己的文件系统详解

使用Java Minio搭建自己的文件系统详解

使用Java Minio搭建自己的文件系统详解

这样就创建好了我们的存储桶。

4、存储桶权限

在创建好存储桶之后,我们为了使用远程连接来访问使用。所以有必要去修改一下存储桶的权限。

使用Java Minio搭建自己的文件系统详解

我们点击最下面的那个Rules,然后点击右上角创建一个访问规则。可以使用精准匹配,也可以使用通配符。

使用Java Minio搭建自己的文件系统详解

前缀我们使用* 这样可以匹配全部访问用户,下面的权限我们使用读写。

5、控制台实现文件的上传与下载

使用Java Minio搭建自己的文件系统详解

我们点到左边的功能栏,然后选择右边我们刚创建的存储桶。然后,,我觉得接下来的操作我都不用细说你们应该都会玩了。

使用Java Minio搭建自己的文件系统详解

使用Java Minio搭建自己的文件系统详解

同样,在上传成功后,也提供下载与预览功能。

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

标签:Java,Minio,文件系统
0
投稿

猜你喜欢

  • Mybatis selectKey 如何返回新增用户的id值

    2022-07-14 05:10:38
  • Android自定义文件路径选择器

    2022-11-09 03:04:07
  • Android中volley封装实践记录(二)

    2023-05-17 02:37:13
  • spring boot学习笔记之操作ActiveMQ指南

    2023-09-12 20:11:52
  • Moshi 完美解决Gson在kotlin中默认值空的问题详解

    2022-10-29 00:03:19
  • 如何动态替换Spring容器中的Bean

    2023-05-22 20:18:59
  • Android开发中使用Intent打开第三方应用及验证可用性的方法详解

    2021-08-12 19:28:47
  • 使用监听器对Spring bean id进行唯一校验过程解析

    2022-04-12 18:07:21
  • 浅析Java中如何实现线程之间通信

    2022-08-24 14:28:36
  • 使用IntelliJ IDEA搭建SSM框架的图文教程

    2022-06-14 00:56:19
  • SpringBoot整合XxlJob分布式任务调度平台

    2022-07-09 09:47:37
  • Seata AT模式启动过程图文示例详解

    2022-12-04 19:24:56
  • 完全解析Android多线程中线程池ThreadPool的原理和使用

    2022-04-07 20:19:40
  • C#简单了解接口(Interface)使用方法

    2022-01-30 18:33:57
  • android侧滑菜单控件DrawerLayout使用方法详解

    2023-02-02 23:58:43
  • 小程序与后端Java接 口交互实现HelloWorld入门

    2023-11-04 18:55:31
  • 浅谈Java编程中string的理解与运用

    2021-05-31 22:15:44
  • 解决RedisTemplate存储至缓存数据出现乱码的情况

    2023-04-20 15:30:58
  • Java设计模式之java原型模式详解

    2022-04-01 03:16:40
  • Android-App增量更新的使用姿势

    2022-09-22 22:47:38
  • asp之家 软件编程 m.aspxhome.com