0


minio开源的对象存储服务器安装及使用

1.minio的介绍

MinIO是一个开源的对象存储服务器,设计用于实现高性能、可扩展的云存储。它兼容Amazon S3云存储服务的API,因此可以与现有的S3兼容应用程序进行集成。
MinIO可以部署在本地服务器、私有云环境或公共云上,如AWS、Azure、Google Cloud等。它通过将数据分散在多个独立节点上实现高可用性和容错性,同时提供强大的分布式对象存储能力。
使用MinIO,你可以通过简单的RESTful API/API对象将数据上传、存储和检索到MinIO服务器。MinIO还提供了许多功能,如数据加密、存储桶生命周期管理、事件通知、访问控制等,以满足各种存储需求。
由于MinIO的可扩展性和高性能,它被广泛用于构建各种应用程序,如数据湖、备份和恢复、文档存储、图像和视频存储等。它还是云原生生态系统中的一部分,可以与Kubernetes、Docker等常用工具无缝集成。
总而言之,MinIO是一个快速、可扩展和开源的对象存储服务器,为开发人员和组织提供了灵活、可靠的数据存储解决方案

2.安装docker版minio

1.拉取docker镜像

sudodocker pull minio/minio

在这里插入图片描述
在这里插入图片描述

2.创建映射文件

mkdir-p /docker/app/minio/data
mkdir-p /docker/app/minio/config

3.启动

docker run -p9000:9000 -p9090:9090 --name minio -d--restart=always -e"MINIO_ACCESS_KEY=minioadmin"-e"MINIO_SECRET_KEY=minioadmin"-v /docker/app/minio/data:/data -v /docker/app/minio/config:/root/.minio minio/minio server /data --console-address ":9090"-address":9000"

这个命令是用来在 Docker 中运行 MinIO 容器的。下面是各个参数的说明:

-p 9000:9000 -p 9090:9090

:将容器的 9000 端口映射到主机的 9000 端口,将容器的 9090 端口映射到主机的 9090 端口。

--name minio

:给容器取一个名称为 “minio”。

-d

:以后台模式运行容器。

--restart=always

:当容器退出时,总是重启容器。

-e "MINIO_ACCESS_KEY=minioadmin" -e "MINIO_SECRET_KEY=minioadmin"

:设置环境变量,指定 MinIO 的访问密钥和密钥。

-v /docker/app/minio/data:/data

:将主机上 /docker/app/minio/data 目录挂载到容器的 /data 目录,用于持久化存储 MinIO 数据。

-v /docker/app/minio/config:/root/.minio

:将主机上 /docker/app/minio/config 目录挂载到容器的 /root/.minio 目录,用于持久化存储 MinIO 配置文件。

minio/minio

:使用 MinIO 官方提供的镜像。

server /data

:运行容器时执行的命令,启动 MinIO 服务器并指定数据目录为 /data。

--console-address ":9090"

:设置 MinIO 控制台的地址为 :9090,即容器的 9090 端口。

-address ":9000"

:设置 MinIO 服务器的监听地址为 :9000,即容器的 9000 端口。

PS:这个命令会创建一个名为 “minio” 的容器,该容器运行 MinIO 对象存储服务器,并将数据存储在本地的指定目录中。你可以使用 http://localhost:9000 访问 MinIO 服务器,并使用指定的访问密钥和密钥进行身份验证。另外,你也可以使用 http://localhost:9090 访问 MinIO 控制台进行管理操作。

4.验证

在这里插入图片描述

3.开发中使用minio

maven依赖

<!--引入MINIO依赖--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.0</version></dependency><dependency><groupId>me.tongfei</groupId><artifactId>progressbar</artifactId><version>0.5.3</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.8.1</version></dependency>

1.工具类准备

minio核心配置类

/**
 * minio核心配置类
 * 通过注入 MinIO 服务器的相关配置信息,得到 MinioClient 对象,我们上传文件依赖此对象
 */
@Configuration
public class MinioConfig {

    @Autowired
    private MinioProperties prop;

    /**
     * 获取 MinioClient
     *
     * @return MinioClient
     */
    @Bean
    public MinioClient minioClient(){return MinioClient.builder().endpoint(prop.getEndpoint()).credentials(prop.getAccessKey(), prop.getSecretKwy())
            .build();}}

minio配置类:

/**
 * minio 属性值
 */
@Data
@Component
@ConfigurationProperties(prefix ="minio")
public class MinioProperties {
    /** 连接url */
    private String endpoint;
    /** 公钥 */
    private String accessKey;
    /** 私钥 */
    private String secretKwy;
    /** 桶名 */
    private String bucketName;}

minio工具类

@ComponentpublicclassMinioUtils{@AutowiredprivateMinioClient minioClient;@AutowiredprivateMinioProperties minioProperties;/**
     * 创建桶
     *
     * @param bucketName 桶名称
     */@SneakyThrowspublicvoidcreateBucket(String bucketName){boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if(!found){
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).region("cn-beijing").build());}}/**
     * 删除桶
     *
     * @param bucketName 桶名称
     */@SneakyThrowspublicvoidremoveBucket(String bucketName){
        minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());}/**
     * 上传文件
     *
     * @param fileName 文件名
     * @param stream 流
     * @param fileSize 文件大小
     * @param type 文件类型
     * @throws Exception
     */publicvoiduploadFile(String bucketName,String fileName,InputStream stream,Long fileSize,String type)throwsException{
        minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(stream, fileSize,-1).contentType(type).build());}/**
     * 判断文件夹是否存在
     *
     * @param bucketName 桶名称
     * @param prefix 文件夹名字
     * @return
     */@SneakyThrowspublicBooleanfolderExists(String bucketName,String prefix){Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(
            prefix).recursive(false).build());for(Result<Item> result : results){Item item = result.get();if(item.isDir()){returntrue;}}returnfalse;}/**
     * 创建文件夹
     *
     * @param bucketName 桶名称
     * @param path 路径
     */@SneakyThrowspublicvoidcreateFolder(String bucketName,String path){
        minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(path).stream(newByteArrayInputStream(newbyte[]{}),0,-1).build());}/**
     * 获取文件在minio在服务器上的外链
     *
     * @param bucketName 桶名称
     * @param objectName 文件名
     * @return 可访问的URL
     * expiry(int duration, TimeUnit unit) 设置有效时间,这里是设置为URL的有效期为1天,即在一天以后国企.
     */@SneakyThrowspublicStringgetObjectUrl(String bucketName,String objectName){return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(
            bucketName).object(objectName).expiry(1,TimeUnit.DAYS).build());}/**
     * 生成可访问的url
     *
     * @param filePath 文件路径
     * @return 可访问的文件, 过期时间1day
     * @author HuangLongFei
     * @since 2023/3/11
     */publicStringgenerateUrl(String filePath){returngetObjectUrl(minioProperties.getBucketName(), filePath);}/**
     * 批量删除文件
     *
     * @param filePathList 文件路径列表
     * @author HuangLongFei
     * @since 2023/7/17
     */publicvoiddeleteFile(List<String> filePathList){if(CollectionUtils.isEmpty(filePathList)){return;}// 构建要删除的文件列表List<DeleteObject> deleteFileList =newArrayList<>();for(String filePath : filePathList){
            deleteFileList.add(newDeleteObject(filePath));}try{// 批量删除文件RemoveObjectsArgs fileArgs =RemoveObjectsArgs.builder().bucket(minioProperties.getBucketName()).objects(
                deleteFileList).build();Iterable<Result<DeleteError>> fileDeleteResult = minioClient.removeObjects(fileArgs);// 注意这里必须迭代返回结果,因为removeObjects是惰性的for(Result<DeleteError> result : fileDeleteResult){DeleteError deleteError = result.get();}}catch(Exception e){thrownewProjectException(ExceptionEnum.MINIO_CALL_ERROR);}}}/**
     * 获取minio中,某个bucket中所有的文件名
     */publicList<String>getFileList(String bucketName){// 根据bucketName,获取该桶下所有的文件信息Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).recursive(true).build());List<String> fileNameList =newArrayList<>();for(Result<Item> result : results){Item item;String fileName =null;try{
                item = result.get();
                fileName = item.objectName();
                fileNameList.add(fileName);}catch(Exception e){
                log.error("call the minioClient.listObjects Error. result={} and message = {}", result, e);}// 获取文件的访问路径if(StringUtils.isNotBlank(fileName)){String accessUrl =getObjectUrl(bucketName, fileName);}}return fileNameList;}

application.yml文件

## 配置minio的公钥和私钥
minio:
  bucket-name: 
  endpoint: 
  access-key: 
  secret-kwy: 

2.测试

@SpringBootTestpublicclass minioTest {@AutowiredprivateMinioUtils minioUtils;@AutowiredprivateMinioProperties minioProperties;privatefinalstaticStringBUCKET_NAME_TEST="bucket-test";/***
     * 测试目的:创建一个bucket
     */@TestpublicvoidcreateBucket(){String bucketName =BUCKET_NAME_TEST;
        minioUtils.createBucket(bucketName);System.out.println("create "+ bucketName +" success!");}/***
     * 测试目的:删除一个bucket
     */@TestpublicvoidremoveBucket(){String bucketName =BUCKET_NAME_TEST;
        minioUtils.removeBucket(bucketName);System.out.println("remove "+ bucketName +" success!");}/***
     * 测试目的:创建文件夹,并上传路径
     */@TestpublicvoiduploadFile(){String filePath ="E:/tempoary/2023-07-21_10-53-35.png";File file =newFile(filePath);// 设置要上传的路径,例如 /test/2023/123.jpg
        filePath ="/test/2023/"+ file.getName();try{FileInputStream fileInputStream =newFileInputStream(file);
            minioUtils.uploadFile(BUCKET_NAME_TEST, filePath, fileInputStream, file.length(),"image/jpeg");System.out.println("上传成功!,文件路径:"+ filePath);}catch(Exception e){System.out.println("上传失败");
            e.printStackTrace();}}/***
     * 测试目的:生成可访问的图片的URL
     */@TestpublicvoidgetObjectUrl(){String filePath ="test/2023/2023-07-21_10-53-35.png";String url = minioUtils.getObjectUrl(BUCKET_NAME_TEST, filePath);System.out.println(url);}}

2023-8-8 15:41:53:更新内容,新增加获取minio中某个bucket所有的文件名的方法

标签: java 开源 服务器

本文转载自: https://blog.csdn.net/weixin_43564783/article/details/131868808
版权归原作者 知行02 所有, 如有侵权,请联系我们删除。

“minio开源的对象存储服务器安装及使用”的评论:

还没有评论