java若依框架集成minio对象存储及搭建服务全过程

一、基本依赖和配置

1、在pom.xml文件中引入minio依赖

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

2、在yml文件里加上minio配置信息

#文件服务器  
minio:
  url: http://{这里填服务器的ip地址}:9000  服务器ip
  access-key: minio  账号
  secret-key: minio123  密码
  bucket-name: test  桶名称,minio服务器配置

3、minio客户端配置类

/**
 * Minio客户端注入
 */
@Configuration
public class MinioConfig {
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
    @Value("${minio.url}")
    private String url;
 
  
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .credentials(accessKey, secretKey)
                .endpoint(url)
                .build();
    }
}

4、上传文件的接口和工具类,接口写在若依的 ruoyi-admin包controller.common.CommonContrller中。

当前文件必要的注入

/** 获取yml配置类里的桶名称*/
    @Value("${minio.bucket-name}")
    private String bucketName;

    @Value("${minio.url}")
    private String minioUrl;
@PostMapping("/uploadMinio")
    public AjaxResult uploadFileMinio(MultipartFile file) throws Exception
    {
        try
        {
                String fileName = FileUploadUtils.uploadMinio(file,this.bucketName);
                AjaxResult ajax = AjaxResult.success();
                String url = minioUrl + fileName;
                ajax.put("url", url);
                ajax.put("fileName", fileName);
                ajax.put("newFileName", FileUtils.getName(fileName));
                ajax.put("originalFilename", file.getOriginalFilename());
                return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }

5、添加通用工具类,ruo-common包utils.file中的FileUploadUtils添加如下方法

private static final String uploadMinio(String bucketName, MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
            InvalidExtensionException
    {
        int fileNamelength = file.getOriginalFilename().length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
        {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }

        assertAllowed(file, allowedExtension);

        try {
            String fileName = extractFilename(file);
            //调用自定义MinioUtil类方法
            return MinioUtil.uploadFile(bucketName, fileName, file);
        } catch (Exception e){
            e.printStackTrace();
        }
        return "";

    }
public static final String uploadMinio(MultipartFile file,String Name) throws IOException
    {
        try
        {
            return uploadMinio(Name,file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        }
        catch (Exception e)
        {
            throw new IOException(e.getMessage(), e);
        }
    }

6、添加minio工具类,创建MinioUtil类

package com.ruoyi.common.utils.file;

/**
 * @ClassName MinioUtil
 * @Description minio
 * @Author yunxiaoleng
 * @Date 2024/7/12 8:54
 * @Version 1.0
 **/

import com.ruoyi.common.utils.spring.SpringUtils;
import io.minio.*;
import io.minio.http.Method;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/** 初始化了连接方法,及桶权限获取*/
public class MinioUtil {
    /**
     * @param bucketName 桶名称
     * @param fileName
     * @throws IOException
     */
    public static String uploadFile(String bucketName, String fileName, MultipartFile multipartFile) throws IOException
    {
        String url = "";
        MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
        try (InputStream inputStream = multipartFile.getInputStream()) {
            boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            if (!found)
            {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
                /**
                 * bucket权限-读写
                 */
                String READ_WRITE = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "/*\"]}]}";
                minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(READ_WRITE).build());
            }
            minioClient.putObject(PutObjectArgs.builder().bucket(bucketName)
                    .object(fileName)
                    .stream(inputStream, multipartFile.getSize(), -1)
                    .contentType(multipartFile.getContentType()).build()
            );
            //路径获取
            url = "/" + bucketName+ "/" + fileName;
            //常规访问路径获取
            return url;
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }
}

二、minio服务搭建

这里用的阿里云服务器,用docker搭建。

1、docker拉取minio镜像

docker pull minio/minio

2、创建文件存储目录

mkdir home/minio-data

3、启动minio,设置登录服务的用户名密码及端口

// 创建minio
 docker run \
--name minio \
-p 9000:9000  \
-p 9001:9001\
-d \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=minio123" \
-v /home/minio-data:/data \
-v /usr/local/minio-config:/root/.minio \
minio/minio server  /data --console-address ":9001" --address ":9000"

4、输入服务器ip地址加端口9001进入minio控制界面,成功进入代表服务部署成功

三、minio管理页面设置

1、bucket创建

刚刚用docker启动时设置的用户名密码,我的是admin/minio123。成功进入后点击Buckets然后点击右上角create创建桶,输入桶的名称完成创建,我在此处创建了一个名为test的桶。

2、bucket权限设置

点击test右边的manage按钮设置,将Access Policy改为public

3、用户创建

点击菜单栏Users进入使用用户管理界面,创建用户设置用户名为minio1密码为minio123,权限配置为读写,点击保存。java配置信息中所配置的key就是此处的用户。

四、测试

使用apifox进行测试,上传文件

成功返回上传文件路径

查看minio后台发现文件已经成功保存

五、报错可能情况

如果有报错的情况,请检测权限是否分配正确,bucket需要public,用户需要读写权限。之后检查yml配置文件中minio配置url端口是9000不是后台的端口9001,两个key对应user的key。bucket的名称要对应不能写错。最后查看阿里云服务控制台安全组所使用的两个端口是否开启。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Minio是一个基于Apache License v2.0开源协议的工具存储服务,它兼容亚马逊S3云存储服务接口,适用于存储大容量非结构化的数据,比如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。\[1\] Minio具有以下功能特性: 1. Amazon S3兼容:Minio使用Amazon S3 v2/v4 API,可以使用Minio SDK、Minio Client、AWS SDK和AWS CLI访问Minio服务器。 2. 数据保护:Minio使用Minio Erasure Code来防止硬件故障,即使有一半以上的驱动器损坏,数据仍然可以恢复。 3. 高度可用:Minio服务器可以容忍分布式设置中高达(N/2)-1节点故障,并且可以配置在Minio和任意Amazon S3兼容服务器之间存储数据。 4. Lambda计算:Minio服务器通过兼容AWS SNS/SQS的事件通知服务触发Lambda功能,支持的目标包括消息队列(如Kafka、NATS、AMQP、MQTT)、Elasticsearch、Redis、Postgres和MySQL等数据库。 5. 加密和防篡改:Minio提供机密性、完整性和真实性保证的加密数据,使用AES-256-GCM、ChaCha20-Poly1305和AES-CBC支持服务器端和客户端加密。 6. 可对接后端存储:除了Minio自己的文件系统,还支持DAS、JBODs、NAS、Google云存储和Azure Blob存储等后端存储。\[1\] 您可以通过自建Minio对象存储集群的方式来满足对存储服务的需求,特别是在不使用云厂商提供的存储服务的情况下。\[1\] Minio的官方网站是https://min.io/,您可以在该网站上找到更多关于Minio的信息和文档。\[2\] \[3\] #### 引用[.reference_title] - *1* [Minio对象存储](https://blog.csdn.net/weixin_30575309/article/details/99263291)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [minio对象存储](https://blog.csdn.net/qq_17522211/article/details/126867470)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值