springboot集成minio客户端

springboot集成minio客户端


由于项目技术栈需要使用springboot框架,以下详细介绍spring boot如何集成minio客户端过程,使用intellij idea集成开发环境,maven进行项目管理。minio基础知识介绍及简单部署使用,可看下我的两外两篇文章:
minio基础知识介绍

minio安装部署及简单使用

1 配置文件桶权限

首先我们需要部署minio服务并运行,如果不知道如何运行,可参照:

minio安装部署及简单使用

通过minio服务自带的web界面,创建文件桶test:
msedge_aVKEv1QQKJ

配置文件桶test权限:
msedge_n1TCgLKme5

test权限配置成公开可读写权限,便于后续演示操作,如想使用minio权限功能,可参照官方文档。

2 引入minio客户端依赖

在pom.xml中加入minio依赖:

 <!--minioclient-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>7.0.2</version>
        </dependency>

3 配置文件修改

在配置文件中增加minio相关配置,我的项目中配置文件格式为properties格式,在末尾增加:

#minio配置参数
minio.endpoint=10.45.154.179
minio.port=9000
minio.accessKey=minioadmin
minio.secretKey=minioadmin
minio.bucketName=test

endpoint、port改成自己minio服务器的IP和端口,accessKey/secretKey改成自己minio服务器的账号信息即可。

4 定义minio配置类

minio参数配置类定义如下,自动映射properties对应参数项,为对象bean属性捆绑数据,类名为MinioConfig。

package com.znv.manage.minio;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {

    //minio服务Ip地址
    private String endpoint;
    //minio服务端口
    private int port;
    //minio接入用户名
    private String accessKey;
    //minio接入密码
    private String secretKey;
    //通讯方式是否为https
    //private boolean secure;
    //存储桶名
    private String bucketName;
}

5 封装MinioClient

为了便于业务层调用,增加代码的灵活性和扩展性,对原始的MinioClient进行封装,形成minio操作的工具类,代码如下:

package com.znv.manage.minio;

import com.alibaba.cloud.commons.io.IOUtils;
import io.minio.MinioClient;
import io.minio.ObjectStat;
import io.minio.PutObjectOptions;
import io.minio.messages.Bucket;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;

@Slf4j
@Component
public class MinIoUtil {

    @Autowired
    MinioConfig minioConfig;
    private static MinioClient minioClient;

    /**
     * 初始化minio配置
     *
     * @param :
     * @return: void
     * @date :
     */

    @PostConstruct
    public void init() {
        try {
            minioClient = new MinioClient(minioConfig.getEndpoint(), minioConfig.getPort(), minioConfig.getAccessKey(), minioConfig.getSecretKey(), false);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("minioncliet init error: ", e.fillInStackTrace());
        }
    }

    /**
     * 判断 bucket是否存在
     *
     * @param bucketName: 文件桶名
     * @return: boolean
     * @date :
     */
    @SneakyThrows(Exception.class)
    public static boolean bucketExists(String bucketName) {
        return minioClient.bucketExists(bucketName);
    }

    /**
     * 创建 bucket
     *
     * @param bucketName: 文件桶名
     * @return: void
     * @date :
     */
    @SneakyThrows(Exception.class)
    public static void createBucket(String bucketName) {
        boolean isExist = minioClient.bucketExists(bucketName);
        if (!isExist) {
            minioClient.makeBucket(bucketName);
        }
    }

    /**
     * 获取全部bucket
     *
     * @param :
     * @return: java.util.List<io.minio.messages.Bucket>
     * @date :
     */
    @SneakyThrows(Exception.class)
    public static List<Bucket> getAllBuckets() {
        return minioClient.listBuckets();
    }

    /**
     * 文件上传
     *
     * @param bucketName: 文件桶名
     * @param fileName:   文件名
     * @param filePath:   文件路径
     * @return: void
     * @date :
     */
    @SneakyThrows(Exception.class)
    public static void upload(String bucketName, String fileName, String filePath) {
        minioClient.putObject(bucketName, fileName, filePath, null);
    }

    /**
     * 文件上传
     *
     * @param bucketName: 文件桶名
     * @param fileName:   文件名
     * @param stream:     文件流
     * @return: java.lang.String : 文件url地址
     * @date :
     */
    @SneakyThrows(Exception.class)
    public static String upload(String bucketName, String fileName, InputStream stream) {
        minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));
        return getFileUrl(bucketName, fileName);
    }

    /**
     * 文件上传
     *
     * @param bucketName: 文件桶名
     * @param file:       文件
     * @return: java.lang.String : 文件url地址
     * @date :
     */
    @SneakyThrows(Exception.class)
    public static String upload(String bucketName, MultipartFile file) {
        final InputStream is = file.getInputStream();
        final String fileName = file.getOriginalFilename();
        minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
        is.close();
        return getFileUrl(bucketName, fileName);
    }

    /**
     * 删除文件
     *
     * @param bucketName: 文件桶名
     * @param fileName:   文件名
     * @return: void
     * @date :
     */
    @SneakyThrows(Exception.class)
    public static void deleteFile(String bucketName, String fileName) {
        minioClient.removeObject(bucketName, fileName);
    }

    /**
     * 获取minio文件的下载地址
     *
     * @param bucketName: 文件桶名
     * @param fileName:   文件名
     * @return: java.lang.String
     * @date :
     */
    @SneakyThrows(Exception.class)
    public static String getFileUrl(String bucketName, String fileName) {
        return minioClient.presignedGetObject(bucketName, fileName);
    }

    /**
     * 下载文件
     *
     * @param bucketName: 文件桶名
     * @param fileName:   文件名
     * @param
     * @return: void
     * @date :
     */
    @SneakyThrows(Exception.class)
    public static InputStream download(String bucketName, String fileName) {
        // 获取对象的元数据
        return minioClient.getObject(bucketName, fileName);
    }
}

6 HTTP接口实例

通过HTTP提供文件上传、下载、删除服务,这里以文件上传为例,实例代码如下:

package com.znv.manage.controller;

import com.alibaba.fastjson.JSONObject;
import com.znv.manage.common.bean.Result;
import com.znv.manage.common.exception.ResultCodeEnum;
import com.znv.manage.minio.MinIoUtil;
import com.znv.manage.minio.MinioConfig;
import com.znv.manage.minio.StorageFileInfo;
import com.znv.manage.service.StorageFileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Base64Utils;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author wangdenuan
 * @version 1.0
 * @description: TODO
 * @date 2022-4-18 8:47
 */
@Slf4j
@RestController
public class testController {
    @Autowired
    MinioConfig minioConfig;

    @Autowired
    StorageFileService storageFileService;

    /**
     * minio上传文件,文件base64加密
     */
    @PostMapping(value = "/test-upload-encryption")
    public Object uploadFileEncryption(@RequestBody JSONObject jsonObj) throws IOException {
        Result ret = new Result();
        if (CollectionUtils.isEmpty(jsonObj)) {
            ret.setCode(ResultCodeEnum.SYSTEMERROR.getCode());
            ret.setMessage("jsonObj is null");
            return ret;
        }

        String fileData = jsonObj.getString("fileData");
        if ((null == fileData) || (0 >= fileData.length())) {
            ret.setCode(ResultCodeEnum.NOTACCEPTABLE.getCode());
            ret.setMessage("fileData is null");
            return ret;
        }
        byte[] picStream = Base64Utils.decodeFromString(fileData);
        String fileName = jsonObj.getString("fileName");
        String httpUrl = MinIoUtil.upload(minioConfig.getBucketName(), fileName, new ByteArrayInputStream(picStream));

        String filePath = "/LOCATEIMG/" + minioConfig.getBucketName() + "/" + fileName;
        JSONObject result = new JSONObject();
        result.put("result", "success");
        result.put("filePath", filePath);
        String[] splitstr = httpUrl.split("\\?", 2);
        httpUrl = splitstr[0];
        result.put("httpUrl", httpUrl);
        return result;
    }
}

通过HTTP接口/test-upload-encryption,上传图片base64编码数据,保存到minio存储服务上,并返回图片URL,通过图片URL可直接方案图片(这里配置的权限是公开可读写,所以直接通过urliuke访问)。
通过postman来验证端口,验证过程如下:
Postman_dURQY6cHeg

可以通过http://10.45.156.156:9000/test/test3.jpg 图片地址直接下载图片:
在这里插入图片描述

7 总结

springboot集成minio非常简单,通过封装minioclient,可增加代码的灵活性可扩展性,隔离底层存储接口,后续入要更换其他的存储,经过简单的适配即可实现,通过REST提供存储的基础能力接口,可非常简单的被使用。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Spring Boot项目中集成Minio,你可以按照以下步骤进行操作: 1. 首先,你需要在项目的pom.xml文件中添加Minio的依赖项。你可以使用以下代码片段来添加依赖项: ``` <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.1</version> </dependency> ``` 2. 接下来,你需要在你的应用程序中使用Minio的API进行连接和操作。你可以参考以下代码片段来完成这一步骤: ```java import io.minio.MinioClient; // 创建MinioClient对象 MinioClient minioClient = new MinioClient("http://localhost:9000", "access-key", "secret-key"); // 检查存储桶是否存在 boolean isExist = minioClient.bucketExists("bucket-name"); if (isExist) { System.out.println("存储桶已存在!"); } else { // 创建存储桶 minioClient.makeBucket("bucket-name"); System.out.println("存储桶创建成功!"); } ``` 3. 最后,你需要在你的应用程序的配置文件(例如application.yml或application.properties)中配置Minio的连接信息。你可以参考以下代码片段来完成这一步骤: ```yaml minio: url: 129.0.0.1:9000 # 替换成你自己的Minio服务端地址 access-key: minioadmin secret-key: minioadmin bucket-name: ding_server ``` 这样,你就成功地集成Minio到你的Spring Boot项目中,并可以使用Minio的API进行对象存储操作了。记得替换相应的连接信息和存储桶名称以适应你的项目需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Springboot集成Minio](https://blog.csdn.net/qq_45374325/article/details/129464067)[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^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [springboot整合minio](https://blog.csdn.net/qq_36090537/article/details/128100423)[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^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹零仓

感谢您的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值