Spring Boot 集成 MinIO 实现文件上传、下载和删除

news2024/11/25 17:49:16

MinIO 是一种开源的对象存储服务,它基于云原生架构构建,并提供了高性能、易于扩展和安全的存储解决方案。

一.安装和配置 MinIO 服务器

为了演示方便,本文采用Windows安装 

1.在官方网站下载MinIO 安装文件,地址:https://dl.minio.org.cn/server/minio/release/windows-amd64/minio.exe; 

2.在minio.exe目录下创建start.bat配置启动文件:"D:\Java\MinIo"是服务启动时文件存放的位置 

minio.exe server D:\Java\MinIo

3.双击minio.exe文件启动

 

4.创建一个 Spring Boot 项目

        1.创建一个 Spring Boot 项目

        2.添加依赖,注意依赖版本

<!--文件上传-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

<!--MinIO对象存储-->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.4.3</version>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.8.1</version>
</dependency>

二.配置文件

        1.yaml配置文件

#MinIO配置
minio:
  endpoint: http://127.0.0.01:9000 #连接地址
  accessKey: minioadmin#账号 默认minioadmin
  secretKey: minioadmin#密码 默认minioadmin
  bucketName: contractfile #桶名 存放合同文件 桶名校验规则:!name.matches("^[a-z0-9][a-z0-9\\.\\-]+[a-z0-9]$")

         2.配置类,用来连接Minio

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

    //连接地址
    private String endpoint;

    //账号 默认minioadmin
    private String accessKey;

    //密码 默认minioadmin
    private String secretKey;

    @Bean
    public MinioClient minioClient() {
        MinioClient minioClient = MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
        return minioClient;
    }

}

        3.工具类,用来操作文件

@Slf4j
@Component
public class MinioUtils {

    @Autowired
    private MinioClient minioClient;

    @Value("${minio.bucketName}")
    private String bucketName;

    /**
     * 操作文件时先创建Bucket
     * 如果没有Bucket则创建
     *
     * @param bucketName
     */
    @SneakyThrows(Exception.class)
    public void createBucket(String bucketName) {
        if (!bucketExists(bucketName)) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }
    }

    /**
     * 判断Bucket是否存在,true:存在,false:不存在
     *
     * @param bucketName
     * @return
     */
    @SneakyThrows(Exception.class)
    public boolean bucketExists(String bucketName) {
        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
    }


    /**
     * 判断文件是否存在
     *
     * @param bucketName
     * @param fileRealName
     * @return
     */
    public boolean isObjectExist(String bucketName, String fileRealName) {
        boolean exist = true;
        try {
            minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileRealName).build());
        } catch (Exception e) {
            log.error("[Minio工具类]>>>> 判断文件是否存在, 异常:", e);
            exist = false;
        }
        return exist;
    }

    /**
     * 使用MultipartFile进行文件上传
     *
     * @param bucketName   存储桶
     * @param file         文件
     * @param fileRealName 文件名
     * @return 文件下载外链
     */
    @SneakyThrows(Exception.class)
    public String uploadFile(String bucketName, MultipartFile file, String fileRealName) {
        createBucket(bucketName);
        InputStream inputStream = file.getInputStream();
        minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(bucketName)
                        .object(fileRealName)
                        .contentType(file.getContentType())
                        .stream(inputStream, inputStream.available(), -1)
                        .build());
        GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
                .bucket(bucketName)
                .object(fileRealName)
                .method(Method.GET).build();
        return minioClient.getPresignedObjectUrl(args);
    }


    /**
     * 删除文件
     *
     * @param bucketName   存储桶
     * @param fileRealName 文件名称
     */
    @SneakyThrows(Exception.class)
    public void removeFile(String bucketName, String fileRealName) {
        createBucket(bucketName);
        minioClient.removeObject(
                RemoveObjectArgs.builder()
                        .bucket(bucketName)
                        .object(fileRealName)
                        .build());
    }

    /**
     * 下载文件
     *
     * @param httpServletResponse httpServletResponse
     * @param fileRealName        文件存储名称
     * @param fileName            文件下载名称
     * @throws IOException IOException
     */
    public void downloadFile(String bucketName, String fileRealName, String fileName, HttpServletResponse httpServletResponse) throws Exception {
        createBucket(bucketName);
        //获取文件流
        InputStream inputStream = minioClient.getObject(GetObjectArgs.builder()
                .bucket(bucketName)
                .object(fileRealName)
                .build());
        //设置响应头信息,告诉前端浏览器下载文件
        httpServletResponse.setContentType("application/octet-stream;charset=UTF-8");
        httpServletResponse.setCharacterEncoding("UTF-8");
        httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        //获取输出流进行写入数据
        OutputStream outputStream = httpServletResponse.getOutputStream();
        // 将输入流复制到输出流
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        // 关闭流资源
        inputStream.close();
        outputStream.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB中norm函数用法

目录 语法 说明 示例 向量模 向量的 1-范数 两个点之间的欧几里德距离 矩阵的 2-范数 N 维数组的 Frobenius 范数 常规向量范数 norm函数的功能是计算向量范数和矩阵范数。 语法 n norm(v) n norm(v,p) n norm(X) n norm(X,p) n norm(X,"fro") 说明…

Android 面试经历复盘整理~

此次面试一共4面4小时&#xff0c;中间只有几分钟间隔。对持续的面试状态考验还是蛮大的。 关于面试的心态&#xff0c;保持悲观的乐观主义心态比较好。面前做面试准备时保持悲观&#xff0c;尽可能的做足准备。面后积极做复盘&#xff0c;乐观的接受最终结果。 切忌急于下结论…

从裸机开始安装操作系统

目录 一、预置知识 电脑裸机 win10版本 官方镜像 V.S. 正版系统 二、下载微软官方原版系统镜像 三、使用微PE系统维护U盘 四、安装操作系统 五、总结 一、预置知识 电脑裸机 ●只有硬件部分&#xff0c;还未安装任何软件系统的电脑叫做裸机。 ●主板、硬盘、显卡等必…

2005-2018年上市公司高管前三名薪酬比例数据

2005-2018年上市公司高管前三名薪酬比例数据 1、时间&#xff1a;2005-2018年 2、指标&#xff1a;证券代码、year、高管薪酬总额、高管前三名薪酬总额、高管前三名薪酬比例、市场类型、行业代码、交易状态 3、范围&#xff1a;上市公司 4、指标解释&#xff1a; 薪酬是员…

深入理解C语言(1):数据在内存中的存储

文章主题&#xff1a;数据在内存中的存储&#x1f30f;所属专栏&#xff1a;深入理解C语言&#x1f4d4;作者简介&#xff1a;更新有关深入理解C语言知识的博主一枚&#xff0c;记录分享自己对C语言的深入解读。&#x1f606;个人主页&#xff1a;[₽]的个人主页&#x1f3c4;&…

【红队攻防】从零开始的木马免杀到上线

0、环境配置说明 应该全部使用云服务器完整演示比较好&#xff0c;奈何太穷了买不起服务器&#xff0c;只能用本地环境演示。所需环境如下&#xff1a; 系统环境&#xff1a; CentOS 7 &#xff0c;Windows 10 软件环境 Cobalt Strike 4.7 , ShellQMaker&#xff0c; 360杀…

医院电子病历编辑器,EMRE(EMR Editor)源码

电子病历主要面向医院机构医生、护士&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。本系统基于云端SaaS服务方式&#xff0c;通过浏览器方式访问和使用系统功能&#xff0c;提供电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;为医疗…

C语言 Cortex-A7核 IIC实验

iic.h #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" /* 通过程序模拟实现I2C总线的时序和协议* GPIOF ---> AHB4* I2C1_SCL ---> PF14* I2C1_SDA ---> PF15** */#define SET_SDA_OUT do{…

JS的基本组成

JavaScript的实现包括以下3个部分&#xff1a; 模块功能ECMAScript(核心)描述了JS的语法和基本对象。文档对象模型 &#xff08;DOM&#xff09;处理网页内容的方法和接口浏览器对象模型&#xff08;BOM&#xff09;与浏览器交互的方法和接口 javascript 有三部分构成&#…

Observability:软件开发和运营中有效日志管理的力量

作者&#xff1a;Luca Wintergerst, David Hope, Bahubali Shetti 当今的快速软件开发过程需要不断扩展且复杂的基础设施和应用程序组件&#xff0c;并且运营和开发团队的工作不断增长且涉及多个方面。 可观察性有助于管理和分析遥测数据&#xff0c;是确保应用程序和基础设施性…

医疗小程序:智能化时代的就医新选择

如今&#xff0c;随着科技的不断进步&#xff0c;人们对于健康的关注度也越来越高。为了满足广大用户的需求&#xff0c;医院与乔拓云平台携手合作&#xff0c;推出了一款医疗小程序&#xff0c;旨在为用户提供更加便捷的健康服务链。 为了让每位用户都能享受到便捷的服务&…

selenium自动化测试+OCR-获取图片页面小说

随着爬虫技术的发展&#xff0c;反爬虫技术也越来越高。 目前有些网站通过自定义字体库的方式实现反爬&#xff0c;主要表现在页面数据显示正常&#xff0c;但是页面获取到的实际数据是别的字符或者是一个编码。 这种反爬需要解析网站自己的字体库&#xff0c;对加密字符使用字…

图片编辑小程序源码/拼图小程序源码

图片编辑小程序源码&#xff0c;拼图小程序源码。全能、便捷的图片编辑工具。实现了图片裁剪、添加文字、涂鸦、拼长图、拼相框等图片编辑功能&#xff0c;另外还有一个简易的表情包制作功能。 主要有以下几个功能&#xff1a;图片裁剪、添加文字、涂鸦功能、拼长图、拼相框、表…

TCPIP状态转换

一个TCP连接在其生命周期中经过了一系列的状态跃迁。一个TCP连接的状态包括&#xff1a; LISTEN &#xff1a;表示正在等待来自任何远程TCP和端口的连接请求&#xff0c;调用listen后套接字出于监听状态SYN_SENT : 表示在发送了连接请求后&#xff0c;正在等待匹配的连接请求…

代码随想录Day03 | 链表基础1 LeetCode T203 移除链表元素 T707设计链表 T206 反转链表

本题思路和解答主要来源于: 代码随想录 (programmercarl.com) LeetCode T203 移除链表元素 题目链接:203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 首先我们回顾一下单向链表,每个链表有一个指针域和一个数据域,在内存中是呈现不连续排列的,对比之前的数组,链…

一百八十八、Hive——HiveSQL查询表中的日期是星期几(亲测,附截图)

一、目的 指标需要查询以工作日和周末维度的数据统计&#xff0c;因此需要根据数据的日期判断这一天属于星期几&#xff0c;周一到周五为工作日&#xff0c;周六到周日为周末 二、SQL查询 &#xff08;一&#xff09;SQL语句 selectday,case when pmod(datediff(create_tim…

【CentOS7】基于python2,3安装docker-compose

【CentOS7】基于python2&#xff0c;3安装docker-compose 前言【基于python2.7】1.安装pip服务2.安装docker-compose服务 【基于python3】1.安排python32.检查是否安装成功3.安排python-pip3并升级4.执行如下命令安装 docker-compose&#xff1a;5.查看docker-compose 版本 前言…

【IDEA】IDEA 单行注释开头添加空格

操作 打开 IDEA 的 Settings 对话框&#xff08;快捷键为CtrlAltS&#xff09;&#xff1b;在左侧面板中选择Editor -> Code Style -> Java&#xff1b;在右侧面板中选择Code Generation选项卡&#xff1b;将Line comment at first column选项设置为false使注释加在行开…

Hazelcast系列(三):hazelcast管理中心

系列文章 Hazelcast系列(一)&#xff1a;初识hazelcast Hazelcast系列(二)&#xff1a;hazelcast集成 Hazelcast系列(三)&#xff1a;hazelcast管理中心 目录 前言 平台搭建 测试 其他 参考 总结 前言 前面&#xff0c;我们通过几种配置方式&#xff08;Hazelcast系…

解决jetbrains-toolbox缺失修改安装路径默认安装C盘问题

前一阵子使用 ToolBox 的时候还可以修改 IDEA 的安装路径&#xff0c;但是过了一段时间在家里电脑发现无法没有了修改安装路径这一选项&#xff0c;庞大的 IDEA 软件累积起来C盘的空间也日趋臃肿&#xff0c;有强迫症的程序员怎么会让它安装在C盘呢&#xff1f; 如图所示&…