【MinIO】MinIO搭建自己的对象存储服务器

最近项目上有需要用到文件存储的功能,综合考量之后决定采用MinIO来存储,于是这篇文章就简单记录一下MinIO服务端的搭建和客户端的基本使用

官方安装包:https://dl.minio.org.cn/server/minio/release/[操作系统平台]/minio,以mac为例

1、MinIO服务端搭建【单节点单磁盘部署】

【参考文档】

由于这里记录的是在开发环境的搭建,所以这里不考虑高可用高性能这类需求,只要求满足功能性要求即可,所以这里采用docker的方式部署单节点单磁盘,集群模式参考官方文档说明,也很简单

docker run -d \
   -p 9000:9000 \
   -p 9001:9001 \
   --name minio \
   -e "MINIO_ROOT_USER=changeme" \
   -e "MINIO_ROOT_PASSWORD=changeme" \
   -v /opt/minio/data:/data \
   minio:latest server /data --console-address ":9001"

端口9000主要提供给各个客户端使用,而9001主要是给web控制台使用

数据目录挂载在了本地/opt/minio/data目录下

设置了账号MINIO_ROOT_USER和密码MINIO_ROOT_PASSWORD,对应的值自行修改

这里拉不下来官方镜像的话可以拉我的阿里云镜像:registry.cn-hangzhou.aliyuncs.com/xhsx/minio:latest

容器启动成功之后就可以通过浏览器http://IP+9000或者http://IP+9001访问,账号和密码就是上面自己设置的值

可以自己在页面控制台手动创建bucket或者上传文件到指定的bucket,或者在console控制台通过命令行操作也行

2、Java客户端的使用

服务端搭建完成之后,如何通过Java去操作文档呢?

【参考文档】

【使用手册】

官方提供了一个Java快速开发指南:https://minio.org.cn/docs/minio/linux/developers/java/minio-java.html#minio-java-quickstart

2.1、文件上传

文档里这里详细描述了怎么用Java客户端去操作MinIO,并提供了一个demo

Maven依赖:

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

<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>4.12.0</version>
</dependency>

java代码

import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;
import org.springframework.util.StopWatch;
import java.util.Objects;

public class FileUploader {
    public static void main(String[] args) throws Exception {
        MinioClient minioClient = null;
        StopWatch stopWatch = new StopWatch();
        try {
            // Create a minioClient with the MinIO server playground, its access key and secret key.
            minioClient =
                    MinioClient.builder()
                            .endpoint("http://10.0.2.197:9000/")
                            .credentials("fZKRjP2RDTm23kf5MsBa", "NuRQjfadNlwamCtGqBas2nG90JMUVuFjoW1pzMFF")
                            .build();

            // Make 'asiatrip' bucket if not exist.
            boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("liuyuankun").build());
            if (!found) {
                // Make a new bucket called 'asiatrip'.
                minioClient.makeBucket(MakeBucketArgs.builder().bucket("liuyuankun").build());
            } else {
                System.out.println("Bucket 'liuyuankun' already exists.");
            }

            // Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket
            // 'asiatrip'.
            stopWatch.start("开始上传");
            minioClient.uploadObject(
                    UploadObjectArgs.builder()
                            .bucket("liuyuankun")
                            .object("instantclient-basic-linux.x64-12.1.0.2.0.zip")
                            .filename("/Users/navy/Downloads/instantclient-basic-linux.x64-12.1.0.2.0.zip")
                            .build());
            System.out.println("'/Users/navy/Downloads/instantclient-basic-linux.x64-12.1.0.2.0.zip' is successfully uploaded as "
                            + "object 'instantclient-basic-linux.x64-12.1.0.2.0.zip' to bucket 'liuyuankun'.");
            stopWatch.stop();
        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
            System.out.println("HTTP trace: " + e.httpTrace());
        } finally {
            if (Objects.nonNull(minioClient)) {
              minioClient.close();
            }
        }
        System.out.println(stopWatch.prettyPrint());
    }
}

注意:

①、这里连接MinIO服务端的端口是9000

②、客户端连接还需要一个credentials值,AccessKey和SecretKey需要在服务端先创建,具体位置在下图所示的地方:

根据提示描述,这里的SecretKey只在创建成功的时候显示一次,防止忘记,可以将文件Download下来保存

运行上面的示例代码,就可以将文件上传到MinIO服务端了

2.2、文件预览

要实现文件预览,需要首先调用getPresignedObjectUrl api获取一个预览地址

public static void testGetPreviewUrl() throws Exception {
  MinioClient minioClient = getMinioClient();
  try {
    GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
      .bucket("liuyuankun")
      .object("1.png")
      .method(Method.GET)
      .build();
    String presignedObjectUrl = minioClient.getPresignedObjectUrl(args);
    System.out.println(presignedObjectUrl);
  } finally {
    minioClient.close();
  }
}

生成的地址:http://10.0.2.197:9000/liuyuankun/1.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=fZKRjP2RDTm23kf5MsBa%2F20241213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241213T021117Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=6d93966a59cd2c67b492832f914ea578d337c4a13fe3868fb4a95b1571a44a40

这个地址也太长了吧,而且默认的只有7天的有效期

这时候如果我们要长期访问,并且对文件没有特殊的安全性要求,则可以将bucket设置为Public,然后整个bucket下的文件就都可以通过域名+bucket+文件名方式访问了。

比如我的服务器地址是10.0.2.197,bucket名称为liuyuankun,文件名为1.png,则可以通过下面地址访问:

http://10.0.2.197:9000/liuyuankun/1.png

注意这里用的是9000端口,如果用9001端口的话默认会直接进入web控制台而不是直接预览文件

当然如果不想要全部放开bucket里的内容,也可以设置bucket的访问策略达到同样的目的,可以通过文件前缀配合访问权限设置

2.3、文件下载

文件下载也非常简单,直接调用downloadObject api即可

DownloadObjectArgs a = DownloadObjectArgs.builder()
                    .bucket("liuyuankun")
                    .object("1.png")
                    .filename("/Users/navy/Downloads/abba.png")	//保存文件到哪儿
                    .build();
minioClient.downloadObject(a);
posted @ 2024-12-16 10:15  会飞的猴儿  阅读(245)  评论(0)    收藏  举报