Springboot 集成 minio分享以及小坑 和 单机部署

2023-11-18

第一步先引入minio依赖

<!--测试minio-->
<dependency>
   <groupId>io.minio</groupId>
   <artifactId>minio</artifactId>
   <version>8.2.1</version>
   <exclusions>
      <exclusion>
         <groupId>com.squareup.okhttp3</groupId>
         <artifactId>okhttp</artifactId>
      </exclusion>
   </exclusions>
</dependency>

<dependency>
   <groupId>com.squareup.okhttp3</groupId>
   <artifactId>okhttp</artifactId>
   <version>3.12.0</version>
</dependency>

这里强制修改okhttp3的版本是因为,有时会存在jar包冲突的问题,导致文件上传报错

java.lang.NoSuchMethodError: okhttp3.Headers.iterator()Ljava/util/Iterator;

我最开始在单体项目中测试上传的时候只引入了下面这个依赖,上传,删除,下载都没问题

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

然后把代码迁入微服务后,上传就报上面那个错误,然后检查半天,可能时jar包冲突,如果报错可以尝试降低版本,minio和boot的版本也存在一些关系,大家可以百度一下。

接下来在yml中配置变量

#minio本地测试
minio:
  minioUrl: http://ip:端口
  userName: minio后台账号
  passWrod: 密码
  bucketName: minio中桶

配置config

@Data
@Component
public class MinIoClientConfig {
    @Value("${minio.minioUrl}")
    private String minioUrl;
    @Value("${minio.userName}")
    private String userName;
    @Value("${minio.passWrod}")
    private String passWrod;


    /**
     * 客户端
     */
    @Bean
    public MinioClient minioClient(){
        return MinioClient.builder()
                .endpoint(minioUrl)
                .credentials(userName, passWrod)
                .build();
    }

}

Controller层

返回体改成自己的就行

@RestController
@RequestMapping("/minio")
public class MinioController {

    @Autowired
    private MinioClient minioClient;

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

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

    //上传文件,返回生成的访问地址
    @PostMapping("/uploadlist")
    public ApiResult<String> uploadlist(MultipartFile file){

        String orgfileName = file.getOriginalFilename();
        //文件名加上uuid防止重复文件名
        String exts = orgfileName.substring(orgfileName.lastIndexOf(".") + 1);
        String substring = orgfileName.substring(0,orgfileName.indexOf("."));
        orgfileName =substring+UUID.randomUUID().toString() + "." + exts;
        try {
            //文件上传
            InputStream in = file.getInputStream();
            minioClient.putObject(
                    PutObjectArgs.builder().bucket(bucketName).object(orgfileName).stream(
                            in, file.getSize(), -1)
                            .contentType(file.getContentType())
                            .build());
            in.close();
        } catch (Exception e) {
            return new ApiResult<>("上传失败");
        }
        String fileUrl = url+"/"+bucketName+"/"+orgfileName;

        return new ApiResult<>(fileUrl);
    }
我这里文件上传后返回的地址,可以在浏览器里直接访问到,是需要在minio后台配置公共的访问方式,就可以了如果考虑安全问题,或者是想把文件分享给第三方,可以生成有一个临时的url,即使时私有的也能访问,不过链接有时间限制,会过期。

    @GetMapping("/url")
    public String getObjectUrl(String fileName) throws Exception {
        // 创建参数
        GetPresignedObjectUrlArgs presignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder()
                .bucket(bucketName)
                .object(fileName) // 文件名字
                .method(Method.GET) // http请求方式
                .expiry(5, TimeUnit.MINUTES) // url过期时间
                .build();
        return minioClient.getPresignedObjectUrl(presignedObjectUrlArgs);
    }
}


    /**
     * 删除文件
     * 
     */
    @PostMapping("/delete/{fileName}")
    public ApiResult<String> delete(@PathVariable("fileName") String filename){
        try {
            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName)
                    .object(filename).build());
        }catch (Exception e){
            e.getMessage();
            return new ApiResult<String>("删除失败");
        }
        return new ApiResult<String>("删除成功");
    }

    //获取上传文件列表
    @GetMapping("/list")
    public ApiResult<List<String>> list() {
        List<String> result = new ArrayList<>();
        // 获取bucket中的文件对象列表
        ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().bucket(bucketName).build();
        Iterable<Result<Item>> objects = minioClient.listObjects(listObjectsArgs);
        objects.forEach(obj -> {
            try {
                Item item = obj.get();
                result.add(item.objectName());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        return new ApiResult<>(result);
    }




    /**
     * 下载文件
     */
    @GetMapping("/download/{filename}")
    public void download(@PathVariable String filename, HttpServletResponse response){
        InputStream in = null;
        try {
            //获取对象信息
            StatObjectResponse stat = minioClient.statObject(
                    StatObjectArgs.builder().bucket(bucketName).object(filename).build());
            response.setContentType(stat.contentType());
            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(filename, "utf-8"));
            //文件下载
            in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(filename).build());
            IOUtils.copy(in, response.getOutputStream());
        }catch (Exception e){
            e.getMessage();
        }finally {
            if(in != null){
                try {
                    in.close();
                }catch (IOException e){
                    e.getMessage();
                }
            }
        }
    }
}

 minio单机部署

先创建/minio文件夹  再把二进制流的minio文件放在里面(minio通过命令下载 )

然后minio文件夹中创建data文件夹,放后续上传的文件

接下来

输入 chmod +x minio 

输入nohup /minio/minio server --address '0.0.0.0:9000' --console-address '0.0.0.0:9001'  /minio/data &

Minio的默认地址端口是9000 可以通过--address '0.0.0.0:9000'修改默认端口

如果9000端口被占用可以修改

--console-address '0.0.0.0:9001' 设置静态端口,通过静态端口访问,如果不设置静态端口会有警告,也会导致minio访问失败

访问minio后台可以用默认端口 也可以用静态  http:// ip+端口

登录账号密码 minioadmin  minioadmin

修改原始的密码 可以在data的隐藏文件夹中修改,这里就不多说。

进来之后可以在这儿新建桶,来存放文件。

这里可以新增用户,并且授权,minio这一块还是做得非常可以

还有什么东西大家就自己摸索吧,探索才是代码人的乐趣。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot 集成 minio分享以及小坑 和 单机部署 的相关文章

随机推荐

  • Python入门教程完整版,Python所有方向学习体系,学完即可就业

    今天给大家带来了干货 Python入门教程完整版 完整版啊 完整版 言归正传 小编该给大家介绍一下这套教程了 希望每个小伙伴都沉迷学习 无法自拔 本套教程学习时间15天 1 3天内容 为Linux基础命令 4 13天内容 为Python基础
  • 导入 导出 jeesite框架封装

    为什么80 的码农都做不了架构师 gt gt gt JeeSite的Excel导入 导出 支持大数据量 使用annotation最小化配置 介绍 对Apache POI 3 9的简单封装 实现Excel的导出导入功能 使用Annotatio
  • 数据库 --- 约束

    一 什么是约束 常见的约束有那些 约束是在创建表的时候 可以给表的字段添加相应的约束 添加约束的目的是为了保证表中数据的合法性 有效性 完整性 常见的约束有 非空约束 not null 唯一约束 unique 主键约束 primary ke
  • Some Tips in Life

    How to Find Digital Books 1 http so baiduyun me 百度云搜索 2 http www zhaofile com 找文件 3 http www cnepub com 掌上书苑 4 http vdis
  • java定义时钟类clock_Java 编程题,定义一个时钟类(Clock)

    题目 Java 编程题 定义一个时钟类 Clock 要求如下 1 存储时钟的时hour 0 23 分minute 0 59 秒second 0 59 2 创建新对象时默认为0时0分0秒 3 设置时钟为指定的时间 4 使时钟前进1秒钟的功能i
  • jstat 命令

    NAME jstat Monitors Java Virtual Machine JVM statistics This command is experimental and unsupported SYNOPSIS jstat Opti
  • mongoDB数据库----简介

    目录 目录 一 NoSQL 1 关系型数据库遵循ACID规则 2 分布式系统 3 分布式计算的优点 4 分布式计算的缺点 5 什么是NoSQL 6 NoSQL 简史 7 NoSQL的优点 缺点 8 NoSQL 数据库分类 二 MongoDB
  • 你知道ChatGPT有哪些商业价值吗?不知道,那没意思

    这段时间 热度zui大的是什么 答案是 ChatGPT 去年11月底上线 当时仅在AI和科技圈内小火了一把 没想到在今年春节后 火爆出圈 ChatGPT的爆火 对商家和品牌方 还有投资创业者来说 是个机遇 普通人虽然很难参与到这些高科技的投
  • Python 求两个正整数的最大公约数

    辗转相除法 思路 1 将两整数求余 a b x 2 如果x 0 则b为最大公约数 3 如果x 0 则 a b b x 继续从1开始执行 4 也就是说该循环的是否继续的判断条件就是x是否为0 代码如下 def main a int input
  • javascript经典代码推荐

  • 基于Matlab的高精度轨道传播器模拟

    基于Matlab的高精度轨道传播器模拟 传播器模拟是一种常见的工程方法 用于预测和分析卫星 火箭或其他天体在轨道上的运动 在这篇文章中 我们将使用Matlab编写一个高精度轨道传播器模拟器 并提供相应的源代码 轨道传播器模拟器的主要目标是根
  • FRP服务器搭建成功后,配置多个客户端使用

    FRP内网穿透服务器搭建成功后 在服务器后台启动FRP 然后还需要两步 第一 在域名购买的网站 比如阿里云 配置一条所有子域名到服务器IP的规则 第二 配置多个客户端 A电脑的配置信息如下 common server addr 服务器IP
  • 前端八股文系列(四)4 JavaScript

    文章目录 前端八股文系列 四 4 JavaScript JS中的8种数据类型及区别 JS中的数据类型检测方案 1 typeof 2 instanceof 3 Object prototype toString call instanceof
  • LeetCode-1781. 所有子字符串美丽值之和【哈希表,字符串,计数】

    LeetCode 1781 所有子字符串美丽值之和 哈希表 字符串 计数 题目描述 解题思路一 简单暴力 双层循环 重点是分别记录子字符串 i j 的最大最小频率 注意这里当i变的时候 所有字符出现的频率就清理 否则在原来的基础上加就行 解
  • 栈的应用一之括号匹配问题

    括号匹配问题 给一个类似这样的字符串 char a abc 检测三种括号的左右括号是否匹配 分析 先取出一个字符 并判断是不是括号 任意括号 1 不是括号 取下一个字符 2 是括号 1 是左括号 压栈 2 是右括号 和栈顶元素比较 栈空 前
  • 教程:使用C#实现PDF文件和字节数组的相互转换

    字节数组有助于存储或传输数据 同样 PDF文件格式因其功能和兼容性而广受欢迎 可以使用C 语言将PDF文件转换为字节数组 也可以将字节数组转换为PDF文件 这可以帮助更有效地在数据库中存储和归档PDF文件 还可以通过使用字节数组来序列化数据
  • CMake中target_compile_definitions的使用

    CMake中的target compile definitions命令用于向target添加编译定义 其格式如下 target compile definitions
  • 什么是DDoS攻击?如何抵御DDos攻击?

    什么是DDoS攻击 如何抵御DDos攻击 单纯的土豆 2016 05 23 安全报道显示2015年DDoS攻击强度创下新纪录 那么DDoS到底是什么呢 了解一些 对产品经理与后台的同事沟通有好处 分布式拒绝服务 DDoS Distribut
  • mac 卸载 XCode

    1 卸载之前的XCode 命令行执行下面命令 sudo Developer Library uninstall devtools mode all sudo Developer Library uninstall developer fol
  • Springboot 集成 minio分享以及小坑 和 单机部署

    第一步先引入minio依赖