一、基本依赖和配置

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的名称要对应不能写错。最后查看阿里云服务控制台安全组所使用的两个端口是否开启。

Logo

快速构建 Web 应用程序

更多推荐