springboot 对接 minio 分布式文件系统

这篇具有很好参考价值的文章主要介绍了springboot 对接 minio 分布式文件系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. minio介绍

Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。区别于分布式存储系统,minio的特色在于简单、轻量级,对开发者友好,认为存储应该是一个开发问题而不是一个运维问题。

2. minio下载地址

下载

3. liunx minio文件授权

chomd +x minio

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

4. 编写启动minio shell文件

vi run.sh

#!/bin/bash
#web管理界面登录用户
export MINIO_ROOT_USER=minio
#web管理界面登录密码
export MINIO_ROOT_PASSWORD=minio
#生成共享链接时,需要配置,否则是本地地址127.0.0.1,有地址的可以修改为自己地址
export MINIO_SERVER_URL=http://IP:9002
# nohup启动服务 指定文件存放路径 /root/data 还有设置日志文件路径 /root/minio/log
nohup ./minio server --address :9002 --console-address :9001 /root/data/minio > /root/logs/minio.log 2>&1 &

5. 赋权限给予shell文件run.sh文件

 chmod u+x run.sh

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java.

6. 启动minio服务,执行sh文件

bash run.sh

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

7. 查看日志,我们在4的时候最后一条上有配置log地址

tail -f /root/logs/minio.log

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

8. 浏览器访问minio界面,并且输入在第四步配置的账号密码

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

9. 接下来我们可以创建一个我们作为测试的文件桶

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

 springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

 10. 当我们创建好桶之后,我们可以前往查看是否存在

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

11. 点击桶进入,手动测试上传文件

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

12. 上传文件之后我们可以选择某一个文件进行下载或者链接共享,链接共享默认时间为7天

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

13. 当我们点击共享时,会出现一个共享链接,我们可以直接在浏览器内查看相对应的文件

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

14. springboot 对接minio,加入POM文件

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

15. 配置application文件

生成请求账号密码

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

minio:
  endpoint: http://IP:9002
  accessKey: bjdZxvMDxAzYETgYn0aY 配置账号
  secretKey: uk7srkLHsYkwzvTYVzDBtwzlXz5fxsoMmNpbb3SN 配置密码
  bucketName: test 桶名称-默认

16.springboot 工具类

package com.project.google.util;

/**
 * @Description: TODO
 * @Author xgp
 * @Date 2023/8/7 8:05
 * @PackageName:com.project.google.util
 * @ClassName: MinioTemplate
 * @Version 1.0
 */


import io.minio.*;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.SneakyThrows;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * Minio 基础操作类
 *
 * @author: zhanghuaiyu
 * @since 2021-01-22 16:27
 */
@Configuration
public class MinioTemplate implements InitializingBean {


    private MinioClient minioClient;
    @Value("${minio.endpoint}")
    private String url;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;

    @Override
    public void afterPropertiesSet() {
        Assert.hasText(url, "Minio url 为空");
        Assert.hasText(accessKey, "Minio accessKey为空");
        Assert.hasText(secretKey, "Minio secretKey为空");
        this.minioClient = new MinioClient(url, accessKey, secretKey);
    }

    /**
     * 创建bucket
     * setBucketPolicy 设置权限才可以预览
     *
     * @param bucketName bucket名称
     */
    @SneakyThrows
    public Boolean createBucket(String bucketName) {
        if (!bucketExists(bucketName)) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            StringBuilder builder = new StringBuilder();
            builder.append("{\n");
            builder.append("    \"Statement\": [\n");
            builder.append("        {\n");
            builder.append("            \"Action\": [\n");
            builder.append("                \"s3:GetBucketLocation\",\n");
            builder.append("                \"s3:ListBucket\"\n");
            builder.append("            ],\n");
            builder.append("            \"Effect\": \"Allow\",\n");
            builder.append("            \"Principal\": \"*\",\n");
            builder.append("            \"Resource\": \"arn:aws:s3:::bucketname\"\n");
            builder.append("        },\n");
            builder.append("        {\n");
            builder.append("            \"Action\": \"s3:GetObject\",\n");
            builder.append("            \"Effect\": \"Allow\",\n");
            builder.append("            \"Principal\": \"*\",\n");
            builder.append("            \"Resource\": \"arn:aws:s3:::my-bucketname/*.*\"\n");
            builder.append("        }\n");
            builder.append("    ],\n");
            builder.append("    \"Version\": \"2012-10-17\"\n");
            builder.append("}\n");
            minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(builder.toString().replace("bucketname", bucketName)).build());
            return true;
        } else {
            return false;
        }
    }

    /**
     * 获取全部bucket
     * <p>
     * https://docs.minio.io/cn/java-client-api-reference.html#listBuckets
     */
    @SneakyThrows
    public List<Bucket> getAllBuckets() {
        return minioClient.listBuckets();
    }

    /**
     * 根据bucketName获取信息
     *
     * @param bucketName bucket名称
     */
    @SneakyThrows
    public Optional<Bucket> getBucket(String bucketName) {
        return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();
    }

    /**
     * 根据bucketName删除信息
     *
     * @param bucketName bucket名称
     */
    @SneakyThrows
    public void removeBucket(String bucketName) {
        minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
    }

    /**
     * 根据文件前置查询文件
     *
     * @param bucketName bucket名称
     * @param prefix     前缀
     * @param recursive  是否递归查询
     * @return MinioItem 列表
     */
    @SneakyThrows
    public List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {
        List<Item> list = new ArrayList<>();
        Iterable<Result<Item>> objectsIterator = minioClient.listObjects(bucketName, prefix, recursive);
        if (objectsIterator != null) {
            Iterator<Result<Item>> iterator = objectsIterator.iterator();
            if (iterator != null) {
                while (iterator.hasNext()) {
                    Result<Item> result = iterator.next();
                    Item item = result.get();
                    list.add(item);
                }
            }
        }

        return list;
    }

    /**
     * 获取文件外链
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @param expires    过期时间 <=7
     * @return url
     */
    @SneakyThrows
    public String getObjectUrl(String bucketName, String objectName, Integer expires) {
        return minioClient.presignedGetObject(bucketName, objectName, expires);
    }

    /**
     * 获取文件路径
     *
     * @param bucketName
     * @param fileName
     * @return
     */
    @SneakyThrows
    public String getObjectUrl(String bucketName, String fileName) {
        return minioClient.getObjectUrl(bucketName, fileName);
    }

    /**
     * 获取文件
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @return 二进制流
     */
    @SneakyThrows
    public InputStream getObject(String bucketName, String objectName) {
        return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
    }

    /**
     * 获取文件
     *
     * @param bucketName
     * @param objectName
     * @return
     */
    @SneakyThrows
    public ObjectStat statObject(String bucketName, String objectName) {
        return minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
    }

    /**
     * 上传文件
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#putObject
     */
    public String putObject(String bucketName, String objectName, MultipartFile file) throws Exception {
        if (!this.bucketExists(bucketName)) {
            this.createBucket(bucketName);
        }
        minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(file.getInputStream(), file.getSize(), PutObjectArgs.MIN_MULTIPART_SIZE).contentType(file.getContentType()).build());
        return bucketName;
    }

    /**
     * 上传文件
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @param stream     文件流
     * @param size       大小
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#putObject
     */
    public void putObject(String bucketName, String objectName, InputStream stream, long size) throws Exception {

        minioClient.putObject(bucketName, objectName, stream, new PutObjectOptions(stream.available(), -1));
    }

    /**
     * 获取文件信息, 如果抛出异常则说明文件不存在
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#statObject
     */
    public ObjectStat getObjectInfo(String bucketName, String objectName) throws Exception {

        return minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
    }

    /**
     * 删除文件
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#removeObject
     */
    public void removeObject(String bucketName, String objectName) throws Exception {
        minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
    }

    /**
     * 批量删除文件夹内所有文件
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#removeObject
     */
    public void removeObjects(String bucketName, String objectName) throws Exception {
        List<Item> list = getAllObjectsByPrefix(bucketName, objectName, false);
        for (Item item : list) {
            removeObject(bucketName, item.objectName());
        }
    }

    @SneakyThrows
    public boolean bucketExists(String bucketName) {
        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
    }

    /**
     * 文件下载
     *
     * @param response
     * @param bucket
     * @param objectName
     * @param outName
     * @throws Exception
     */
    public void download(HttpServletResponse response, String bucket, String objectName, String outName) throws Exception {
        ObjectStat stat = this.statObject(bucket, objectName);
        response.setContentType(stat.contentType());
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(outName, "UTF-8"));
        response.setHeader("FileName", URLEncoder.encode(outName, "UTF-8"));
        InputStream in = this.getObject(bucket, objectName);
        IOUtils.copy(in, response.getOutputStream());
        in.close();
    }

    /**
     * 合并分片文件到指定目录
     *
     * @param bucket
     * @param fileName
     * @param sources
     * @return
     * @throws Exception
     */
    public ObjectWriteResponse composeObject(String bucket, String fileName, List<ComposeSource> sources) throws Exception {
        ObjectWriteResponse response = minioClient.composeObject(ComposeObjectArgs.builder()
                .bucket(bucket)
                .object(fileName)
                .sources(sources)
                .build());
        return response;
    }
}

 17.请求测试controller方法

package com.project.google.controller;

import afu.org.checkerframework.checker.oigj.qual.O;
import com.project.google.util.MinioTemplate;
import io.minio.messages.Bucket;
import org.apache.commons.io.IOUtils;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * @Description: TODO
 * @Author xgp
 * @Date 2023/8/7 8:35
 * @PackageName:com.project.google.controller
 * @ClassName: TbMinioController
 * @Version 1.0
 */
@RestController
public class TbMinioController {

    @Autowired
    private MinioTemplate minioTemplate;

    //创建新的桶
    @GetMapping("createBucket")
    public Object createBucket(String bucketName){
        return minioTemplate.createBucket(bucketName);
    }

    //获取对应桶信息
    @GetMapping("getList")
    public Object getList(String bucketName){
        Bucket bucket = minioTemplate.getBucket(bucketName).get();
        Map<String,Object> map = new HashMap<>();
        map.put("name",bucket.name());
        map.put("createDate",bucket.creationDate());
        return map;
    }

    //获取所有桶信息
    @GetMapping("getAll")
    public Object getAll(){
        List<Map> list = new ArrayList<>();
        List<Bucket> buckets = minioTemplate.getAllBuckets();
        buckets.stream().forEach(item -> {
            Map<String,Object> map = new HashMap<>();
            map.put("name",item.name());
            map.put("createDate",item.creationDate());
            list.add(map);
        });
        return list;
    }

    /**上传文件到对应桶里,如果你想放入指定文件夹,传入文件名前面带上文件夹名称及路径,比如 test文件夹就- test/文件名,依次类推*/
    @PostMapping("uploadFile")
    public Object uploadFile(@RequestParam("file") MultipartFile file) throws Exception {
        /**文件夹属性,可加载文件前方*/
        return minioTemplate.putObject("test","uu/" + file.getOriginalFilename(),file);
    }

    /**获取图片信息,二进制数据转换为图片呈现*/
    @GetMapping(value = "getFile", produces = MediaType.IMAGE_JPEG_VALUE)
    public byte[] getFile(@RequestParam("bucketName") String bucketName
            ,@RequestParam("objectName") String objectName) throws IOException {
        InputStream stream = minioTemplate.getObject(bucketName, objectName);
        byte[] bytes = IOUtils.toByteArray(stream);
        return bytes;
    }

    /**获取图片分享链接,expires为过期时间,可为小于等于7*/
    @GetMapping(value = "getObjectUrl")
    public String getObjectUrl(@RequestParam("bucketName") String bucketName
            ,@RequestParam("objectName") String objectName) throws IOException {
        return minioTemplate.getObjectUrl(bucketName, objectName, 1);
    }


}

18.接口测试

18.1 查询test bucket信息

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

 

18.2 获取所有bucket信息

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

18.3 上传文件,我这边是通过apipox进行测试

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

18.4 查看图片信息

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java

18.5 生成共享链接

springboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,javaspringboot 对接 minio 分布式文件系统,java,minio,spring boot,后端,java文章来源地址https://www.toymoban.com/news/detail-634937.html

到此,整个对接过程就已经差不多了,其他扩展功能,如有需要,可以咨询这边,给出解答或者思路。

到了这里,关于springboot 对接 minio 分布式文件系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OSS文件上传、MinIO分布式文件存储系统

    阿里云OSS上传图片 实现步骤: 1. 定义OSS相关配置 application-dev.yml application.yml 2. 读取OSS配置 在sky-common模块中,已定义 3. 生成OSS工具类对象 在sky-server模块 其中,AliOssUtil.java已在sky-common模块中定义 4. 定义文件上传接口 在sky-server模块中定义接口 MinIO分布式文件存储系统 MinI

    2024年01月24日
    浏览(36)
  • 1.使用分布式文件系统Minio管理文件

    文件系统 文件系统 是操作系统用于组织管理 存储设备(磁盘)或分区 上文件信息的方法和数据结构,负责对文件存储设备空间进行组织和分配,并对存入文件进行保护和检索 文件系统是负责管理和存储文件的系统软件,操作系统通过文件系统提供的接口去存取文件,用户通过操

    2024年01月22日
    浏览(30)
  • 【学习笔记】minIO分布式文件服务系统

    1.1 minIO是什么? MinIO是专门为海量数据存储、人工智能、大数据分析而设计的对象存储系统。(早前流行的还有FastDFS) 据官方介绍,单个对象最大可存储5T,非常适合存储海量图片、视频、日志文件、备份数据和容器、虚拟镜像等。 采用golang语言编译 客户端和用户端交互采

    2024年02月07日
    浏览(25)
  • 常用分布式文件系统(对象存储)对比-SeaweedFS、Minio

    常用分布式文件系统,相对比较热门的有Minio,SeaweedFS,FastDFS,ceph。主要对比一下Minio,SeaweedFS。 什么是SeaweedFS? SeaweedFS是一种简单的、高度可扩展的分布式文件系统。SeaweedFS是一个非常优秀的由 Go语言开发的分布式存储开源项目。它是用来存储文件的系统,并且与使用的语言无

    2024年02月03日
    浏览(41)
  • 【Spring Cloud】新闻头条微服务项目:分布式文件系统MinIO实现文章页面存取

      个人简介:  📦个人主页:赵四司机 🏆学习方向:JAVA后端开发  📣种一棵树最好的时间是十年前,其次是现在! ⏰往期文章:SpringBoot项目整合微信支付 🧡喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。 前言: 最近在做一个基于SpringCloud+Springboot+Docker的新闻头

    2023年04月08日
    浏览(43)
  • minio分布式文件存储

    基本介绍 什么是  MinIO         MinIO 是一款基于 Go 语言的高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。基于 Apache License v2.0 开源协议,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应用结合使用,例如

    2024年02月08日
    浏览(39)
  • 分布式文件存储MinIO-监控

    MinIO自身提供了关于集群状态和操作的相关的Prometheus SQL指标与支持Prometheus数据模型的监控指标收集工具进行搭配使用,无论是主机部署亦或是云上部署都可以进行集成。官方选定的第三方监控软件为Prometheus和InfluxDB,使用者可以根据各自公司对于监控设施的建设进行选择。

    2024年02月11日
    浏览(38)
  • spring boot + minio 分布式文件上传

    1、分布式文件系统 简单理解为:一个计算机无法存储海量的文件,通过网络将若干计算机组织起来共同去存储海量的文件,去接收海量用户的请求,这些组织起来的计算机通过网络进行通信。 好处: 一台计算机的文件系统处理能力扩充到多台计算机同时处理。 一台计算机

    2024年02月08日
    浏览(43)
  • 【分布式文件存储】MinIO部署及实现文件上传下载

    目录 概述 MinIO集群部署 准备docker-compose.yml 测试启动 MinIO用户管理 Buckets管理  创建Buckets MinIO客户端 引入依赖   文件上传下载Demo 调用API碰到的问题 MinIO | 高性能, Kubernetes 原生对象存储 MinIO是全球领先的对象存储先锋,目前在全世界有数百万的用户。 高性能 ,在标准硬件

    2024年02月07日
    浏览(45)
  • Docker搭建MinIo分布式系统

    文件系统是负责管理和存储文件的系统软件,操作系统通过文件系统提供的接口去存取文件,用户通过操作系统访问磁盘上的文件。 下图指示了文件系统所处的位置: 通过概念可以简单理解为:一个计算机无法存储海量的文件,通过网络将若干计算机组织起来共同去存储海

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包