前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springboot集成minio,docker部署

springboot集成minio,docker部署

作者头像
知识浅谈
发布于 2023-09-25 00:22:34
发布于 2023-09-25 00:22:34
35900
代码可运行
举报
文章被收录于专栏:分享学习分享学习
运行总次数:0
代码可运行

docker部署minio

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -p 9000:9000 -p 9090:9090 --name minio     -v ~/minio/data:/data     -e MINIO_ROOT_USER=root     -e MINIO_ROOT_PASSWORD=chaiyinlei     -d minio/minio server /data --console-address ":9090"

springboot配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <dependency>
      <groupId>io.minio</groupId>
      <artifactId>minio</artifactId>
      <version>8.5.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>4.11.0</version>
    </dependency>

application.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
minIo:
  endpoint: http://你的ip地址:9000
  accessKey: root
  secretKey: chaiyinlei

minioconfig

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
@Configuration
public class MinIoConfig {

    @Value(value = "${minIo.endpoint}")
    private String endpoint;
    @Value(value = "${minIo.accessKey}")
    private String accessKey;
    @Value(value = "${minIo.secretKey}")
    private String secretKey;
}

minioutils

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.test.empback.utils;

import com.test.empback.config.MinIoConfig;
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;


@Slf4j
@Component
@Configuration
public class MinIoUtil {


    private MinIoConfig minIO;

    private static MinioClient minioClient;

    public MinIoUtil(MinIoConfig minIO) {
        this.minIO = minIO;
    }


    /**
     * @param
     * @Author: yinlei
     * @Description: 初始化
     * @Date:
     * @Return void
     */
    @PostConstruct //@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次
    public void init() { //构建minio客户端
        minioClient = MinioClient.builder()
                .endpoint(minIO.getEndpoint())
                .credentials(minIO.getAccessKey(), minIO.getSecretKey())
                .build();
    }



    /**
     * @param bucketName 桶名
     * @Author: yinlei
     * @Description: 判断bucket是否存在
     * @Date: 2023/09/23 15:19
     * @Return boolean
     */
    public boolean bucketExists(String bucketName) {
        try {
            return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return false;
    }


    /**
     * @param bucketName 桶名
     * @Author: yinlei
     * @Description: 创建桶
     * @Date: 2023/09/23 15:52
     * @Return void
     */
    public void makeBucket(String bucketName) {
        try {
            boolean isExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            if (!isExists) {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }

    /**
     * @param
     * @Author: yinlei
     * @Description: 列出所有存储桶的存储信息
     * @Date:
     * @Return void
     */
    public void listBuckets() {
        List<Bucket> bucketList = null;
        try {
            bucketList = minioClient.listBuckets();
            for (Bucket bucket : bucketList) {
                System.out.println(bucket.creationDate() + ", " + bucket.name());

            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }


    /**
     * @param bucketName 桶名
     * @Author: yinlei
     * @Description: 列出存储桶的对象信息
     * @Date:
     * @Return void
     */
    public List<String> listObject(String bucketName) {
        List<String> fileList = new ArrayList<>();
        try {
            Iterable<Result<Item>> results = minioClient.listObjects(
                    ListObjectsArgs.builder().bucket(bucketName).build());
            for (Result<Item> result : results) {
                Item item = null;
                item = result.get();
                fileList.add(item.objectName());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileList;
    }

//    public Iterable<Result<Item>> listObject(String bucketName, String prefix) throws XmlParserException {
//        return minioClient.listObjects(bucketName, prefix);
//    }
    /**
     * @param bucketName 桶名
     * @Author: yinlei
     * @Description: 删除桶
     * @Date: 
     * @Return void
     */
    public void removeBucket(String bucketName) {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param bucketName 桶名
     * @param objectName 存储桶里的对象名称
     * @param fileName   文件名
     * @Author: yinlei
     * @Description: 文件上传
     * @Date: 
     * @Return void
     */
    public void uploadObject(String bucketName, String objectName, String fileName) {

        try {
            minioClient.uploadObject(
                    UploadObjectArgs.builder()
                            .bucket(bucketName)
                            .object(objectName)
                            .filename(fileName)

                            .build());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param bucketName  桶名
     * @param objectName  存储桶里的对象名称
     * @param stream      要上传的流
     * @param contentType 文件类型
     * @Author: yinlei
     * @Description: 上传文件(流式)
     * @Date: 2023/09/24 10:12
     * @Return void
     */
    public void putObject(String bucketName, String objectName, InputStream stream, String contentType) {
        try {
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .stream(
                            stream, -1, 10485760
                    )
                    .contentType(contentType)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param bucketName 桶名
     * @param objectName 存储桶里的对象名称
     * @Author: yinlei
     * @Description: 删除文件
     * @Date: 2023/09/24 10:14
     * @Return void
     */
    public void removeObject(String bucketName, String objectName) {
        try {
            minioClient.removeObject(
                    RemoveObjectArgs.builder()
                            .bucket(bucketName)
                            .object(objectName)
                            .build());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param bucketName 桶名
     * @param objectName 存储桶里的对象名称
     * @param saveDir   把文件下载到这里
     * @Author: yinlei
     * @Description: 下载文件
     * @Date: 2023/09/24 10:17
     * @Return void
     */
    public void download(String bucketName, String objectName, String saveDir) {
        try {
            minioClient.downloadObject(
                    DownloadObjectArgs.builder()
                            .bucket(bucketName)
                            .object(objectName)
                            .filename(saveDir)
                            .build());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void downloadFile(String bucketName, String fileName, HttpServletResponse response) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
        InputStream fileStream = minioClient.getObject(
                GetObjectArgs.builder()
                        .bucket(bucketName)
                        .object(fileName)
                        .build()
        );
        String[] strings = fileName.split("/");
        fileName = strings[strings.length - 1];
        System.out.println("filename=" + fileName);
        String fileNameCode = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
//        response.setContentType( "application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileNameCode);
        ServletOutputStream outputStream = response.getOutputStream();
        // 输出文件
        int length;
        byte[] buffer = new byte[1024];
        while ((length = fileStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }
        outputStream.flush();
        fileStream.close();
        outputStream.close();
    }




    /**
     * @param bucketName 桶名
     * @param objectName 存储桶里的对象名称
     * @Author: yinlei
     * @Description: 获取文件外链
     * @Date: 2023/09/24 10:18
     * @Return String
     */
    public String getObjectUrl(String bucketName, String objectName) {
        try {
//            String url = minioClient.getObjectUrl(bucketName, objectName);
            String url = minioClient.getPresignedObjectUrl(
                    GetPresignedObjectUrlArgs
                            .builder()
                            .method(Method.GET)
                            .bucket(bucketName)
                            .object(objectName)
                            .build());
            System.out.println(bucketName + "——" + objectName + " can be downloaded by: " + url);
            return url;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    public boolean isFileExisted(String fileName, String bucketName) {
        boolean flag = false;
        InputStream inputStream = null;
        try {
            inputStream = minioClient.getObject(
                    GetObjectArgs.builder()
                            .bucket(bucketName)
                            .object(fileName)
                            .build());
            if (inputStream != null) {
                flag = true;
            }
        } catch (Exception e) {
            log.error(e.getMessage());
            flag = false;
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    log.error(e.getMessage());
                }
            }
        }
        return flag;
    }

    /**
     * 获取文件流
     */
    public InputStream getInputStream(String bucketName, String fileName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        InputStream inputStream = null;
        inputStream = minioClient.getObject(
                GetObjectArgs.builder()
                        .bucket(bucketName)
                        .object(fileName)
                        .build());
        return inputStream;
    }
}

ok,搞定。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
测试人员提出的BUG,要追着开发改吗
其次要知道,开发其实跟测试一样看重产品的质量,因为他们是真正实施的人,谁不希望自己做的东西能够尽善尽美呢。
程序媛淼淼
2022/09/01
2461
常用精选面试题
App测试与Web测试从功能测试和整体流程角度来讲,几乎没有什么区别,都是点点点的测试。
wangmcn
2022/07/26
5930
测试人员怎样定位bug原因
作为测试人员,和我们最常打交道的,莫属bug。当你发现bug后,会采取什么样的行动?是直接报出来,亦或找找问题原因?
测试开发社区
2020/08/27
2.3K0
软件测试从零开始(三)
5、缺陷报告 当找开发而对方不愿意理你的时候,当感觉绩效考核对你不公的时候,当看到是别人晋升加工资而非你的时候,当提了问题而开发不改的时候,也许一种可能是你在测试报告上存在问题。 顺便说一句,个人看法:测试人员的责任不是保证所有错误都能得到改正,而是准确报告问题,使项目干系人能够理解问题的影响,不过具体如何,还需看测试员在自己公司的使命,可以看一下我的另一篇文章《测试员职责浅谈》。 5.1 报告缺陷之描述 缺陷报告需要尽可能提高可读性: 一次只走查该程序错误一步 为每一步编号 不要跳过重
张树臣
2018/05/15
7310
测试应该如何处理跟开发之间的“敏感”关系?
从整个产品研发的角度看,开发是产品的制造者,产品就相当于他的‘孩子’,而测试的工作是去找这个“孩子”身上的毛病。相信,没有一个人喜欢别人对自己的孩子各种挑错。
测试开发技术
2019/11/24
1K0
测试应该如何处理跟开发之间的“敏感”关系?
软件测试常见面试题
测试中抓取log会涉及adb命令的使用 ,也如会用monkey进行APP的稳定性测试,有涉及到代码修改户使用到Androidstudio这些开发工具。
wangmcn
2024/01/26
3300
软件测试常见面试题
测试开发需要学习的知识结构[通俗易懂]
黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。黑盒测试方法主要有等价类划分、边值分析、因—果图、错误推测等,主要用于软件确认测试。 “黑盒”法着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。“黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。
全栈程序员站长
2022/07/28
5410
测试开发需要学习的知识结构[通俗易懂]
其他企业部分面试题汇总
Linux可以运行在服务器和其他大型平台之上,如大型机和超级计算机,是一个领先的操作系统。世界上500个最快的超级计算机90%以上运行Linux发行版或变种,最快的前10名超级计算机运行的都是Linux操作系统。
找Bug
2022/07/22
8230
其他企业部分面试题汇总
从华为离职了
大家好,我是微笑哥。 在我看来,程序员是一个流动性很大的职业。 找工作就像找对象,也讲究缘分二字。 只有找到适合自己的工作,才能和“这份工作”过得长久。 想要去一家公司,一定要提前打听好这家公司的风格,自己是否可以接受。 每家公司都不会尽善尽美,但要找到最适合自己的。 今天分享一位博主,从华为转正到离职的经历,一起看看他的故事。 作者:Bai Bing | 编辑:Jack Cui https://zhuanlan.zhihu.com/p/485029198 我转正后看到了大家的能力和努力,也意识到在预期的时
纯洁的微笑
2022/04/28
3590
从华为离职了
软件开发项目管理经验总结
这是我从事软件外包工作以来的项目管理经验的总结,编写文章的目的是为了回顾和总结自己的一些想法,如果其中有不足的地方大家可以一起讨论交流。
全栈程序员站长
2022/08/27
1.2K0
软件开发项目管理经验总结
提问的智慧 How To Ask Questions The Smart Way 脑图和文章
在黑客的世界里,当你拋出一个技术问题时,最终是否能得到有用的回答,往往取决于你所提问和追问的方式。本指南将教你如何正确的提问以获得你满意的答案。
CreateAMind
2018/07/25
2.1K0
提问的智慧 How To Ask Questions The Smart Way 脑图和文章
提问的智慧
Copyright © 2001,2006,2014 Eric S. Raymond, Rick Moen
全栈程序员站长
2022/09/06
3350
技术可以小白,但心态不行!聊聊在黑客的世界里,我们如何正确提问!
刚开始,群里聊的话题都比较水,群内有些行为也需要纠正,但这两天慢慢的有人在推荐与自荐开源项目了。
GitHubDaily
2019/06/18
6740
提问的智慧
引言 在黑客的世界里,你所提技术问题的解答很大程度上取决于你提问的方式与解决此问题的难度,本文将教你如何提问才更有可能得到满意的答复。 开源程序的应用已经很广,你通常可以从其他更有经验的用户而不是黑客那里得到解答。 这是好事,他们一般对新手常有的毛病更容忍一点。然尔,使用我们推荐的方法,象对待黑客那样对待这些有经验的用户,通常能最有效地得到问题的解答。 第一件需要明白的事是黑客喜欢难题和激发思考的好问题。假如不是这样,我们也不会写本文了。 如果你能提出一个有趣的问题让我们咀嚼玩味,我们会感激你。好问题是种激
纯洁的微笑
2018/07/20
7340
万字详文告诉你如何做 Code Review
作为公司代码委员会 golang 分会的理事,我 review 了很多代码,看了很多别人的 review 评论。发现不少同学 code review 与写出好代码的水平有待提高。在这里,想分享一下我的一些理念和思路。
DevOps时代
2020/07/16
7110
万字详文告诉你如何做 Code Review
《软件开发的201个原则》—— 一般原则、需求原则、设计原则、编码原则、测试原则、管理原则、产品原则、演变原则
我无意中发现了这一个书《软件开发的201个原则》,是国外一个大佬写的,国内诸多大佬推荐,发现写的很好,可以用来指导软件的开发!下面的内容是我手打的一遍,内容不全,甚至一些信息可能敲错了,大家想看完整地内容,还是建议网购买书!
明志德道
2023/10/21
1.2K0
《软件开发的201个原则》——  一般原则、需求原则、设计原则、编码原则、测试原则、管理原则、产品原则、演变原则
『简书API:jianshu 基于golang -- 用法介绍 (2)』
API.png 首先我做这个项目的目的是朴素的: 熟悉golang 语法 通过这个项目呢,大家可以分析任意网站, 任意解析网站形成自己的API。 这个项目受项目:zhihu-go 影响。阅读完该项目的源码后,我立刻觉得,在掌握了 golang 基础语法之后,我可以写出一个类似的项目。尽管原项目因为知乎的改版而导致现在不能运行了,但就基本思想还是可以借鉴的。 1. 『简书API : jianshu 基于 golang (1)』
谢伟
2018/06/06
2.2K0
相亲对象告诉你他的相亲史_时间让我看懂一切
注:本文,来自csdn论坛的觉的楼主写的不错,所以就引用过啦了,别介意哦,http://topic.csdn.net/u/20100624/16/80f263ca-b05f-456f-bf5f-9d87dd78a6f9.html,作者:NewJacket (这个真不是马甲)
全栈程序员站长
2022/11/08
3.3K0
鹅厂练习13年Coding后,我悟了
本文主要受《程序员修炼之道: 通向务实的最高境界》、《架构整洁之道》、《Unix 编程艺术》启发。我不是第一个发明这些原则的人,甚至不是第一个总结出来的人,别人都已经写成书了!务实的程序员对于方法的总结,总是殊途同归。
腾讯云开发者
2023/09/26
7190
鹅厂练习13年Coding后,我悟了
《增长黑客》节选与笔记[通俗易懂]
这本书涉及了很多具体又贴合现实的互联网产品问题,即使你是非专业人士,也应该读一读,了解开发者是如何把你当猫耍的,以便你更好地认识一些套路,解锁,为选择手机软件或者云端应用擦亮眼睛!
全栈程序员站长
2022/08/27
7.8K0
推荐阅读
相关推荐
测试人员提出的BUG,要追着开发改吗
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档