Springboot功能模块之文件上传(minio)

news2024/12/24 2:16:29

一、概述

1.1什么是MinIO?

  • MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用,它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
  官网:https://min.io
  中文:https://www.minio.org.cn/,http://docs.minio.org.cn/docs/

1.2常见的数据存储

MinIO存储基于对象存储(Object Storage)是一种数据存储架构,它以对象为单位来处理、存储和检索数据,每个对象都包含了数据本身以及元数据;

MinIO存储的元数据主要包括对象的描述信息,如用户(account)、存储桶(bucket)以及存储桶索引(bucket index)等;

文本数据:新闻报道、社交媒体文章、博客......

语音数据:音频形式存储的数据,语音

mp3文件...... 图像数据:各种图片......

视频数据:各种视频、电影......

非结构化数据:没有明确结构的数据,比如社交评论、日志文件......

1.3docker部署

docker run -p 9000:9000 -p 9001:9001 \
     --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=minioadmin" \
     -e "MINIO_SECRET_KEY=minioadmin" \
     -e "MINIO_SERVER_URL=http://服务器ip:9000"
     -v /home/minio/data:/data \
     -v /home/minio/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9001" -address ":9000"

Minio(官方docker版)容器部署时区问题

解决方案https://blog.csdn.net/yang2330648064/article/details/138453712

1.4页面访问操作

登录

访问:http://192.168.124.132:9090/login 用户名:密码  minioadmin:minioadmin

 创建用户

创建组

创建accessKey和secretKey 

 点击下载

 文件内容如下,保存文件,SDK操作文件的API需要用到

{"url":"http://192.168.124.132:9000","accessKey":"XO1JDovW2FTmGaBb","secretKey":"uG6wMfylUnOVH5WzwxqnldOWw2dMshNX","api":"s3v4","path":"auto"}

创建Bucket

上传文件

二、springboot整合MinIO

 官方文档:https://min.io/docs/minio/linux/developers/minio-drivers.html

Java快速指南 — MinIO中文文档 | MinIO Linux中文文档

2.1maven配置

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

2.2写配置

@Component
public class MinioConfig {
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint("http://ip:9000")
                .credentials("minioadmin", "minioadmin")
                .build();
    }
}

2.3MInIO常见API

MinIO中的Bucket、Object

Bucket 是存储Object的逻辑空间,每个Bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;

Object 是存储到MinIO的基本对象,对用户而言,相当于文件;

桶操作 

  • bucketExists() 用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在
  • makeBucket() 用于创建一个新的存储桶(bucket),需要指定存储桶的名称;
  • listBuckets() 用于列出用户有权访问的所有存储桶,返回存储桶的列表;
  • removeBucket() 用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;
 @Autowired
    private MinioClient minioClient;
    @Test
    void contextLoads() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        System.out.println(minioClient);
        if(!minioClient.bucketExists(BucketExistsArgs.builder().bucket("lab-test").build())){
            System.out.println("不存在创建bucket");
            minioClient.makeBucket(MakeBucketArgs.builder().bucket("lab-test").build());
        }
        System.out.println(minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build()));
        System.out.println(minioClient.listBuckets());
        minioClient.removeBucket(RemoveBucketArgs.builder().bucket("test").build());
    }

文件操作

  • putObject():用于上传文件到指定的存储桶;
  • statObject():用于检查指定的对象(文件)的状态;
  • getPresignedObjectUrl():用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问;
  • getObject():用于从指定的存储桶中下载文件;
  • listObjects():用于列出指定存储桶中的所有对象(文件);
  • removeObject():用于删除指定存储桶中的对象,需要指定存储桶名称和对象键;

@Test
    void testFile() throws Exception {
//        上传文件
        File file = new File("D:\\workspace-java\\lab-test\\files\\1716776437448-1.jpg");
        ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder()
                .bucket("lab-test")
                .object("test.jpg")
                .stream(new FileInputStream(file), file.length(), -1)
                .build()
        );
        System.out.println(objectWriteResponse);

        ObjectWriteResponse objectWriteResponse2 = minioClient.uploadObject(UploadObjectArgs.builder()
                .bucket("lab-test")
                .object("test2.jpg")
                .filename("D:\\workspace-java\\lab-test\\files\\1716776437448-1.jpg")
                .build()
        );
      //        检查指定的对象(文件)的状态
      try {
          boolean isObjectExist = minioClient.statObject(StatObjectArgs.builder()
                  .bucket("lab-test")
                  .object("test3.jpg")
                  .build()
          ) != null;
          System.out.println("文件存在");
      }catch (Exception e){
          System.out.println("文件不存在");
      }
      //        获取对象的URL
      String presignedObjectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                .bucket("lab-test")
                .object("test.jpg")
                .expiry(3, TimeUnit.MINUTES)
                .method(Method.GET)
                .build());
        System.out.println(presignedObjectUrl);
        //        下载文件
        GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder()
                .bucket("lab-test")
                .object("test.jpg")
                .build());
        System.out.println(getObjectResponse.transferTo(new FileOutputStream("D:\\workspace-java\\lab-test\\files\\123.jpg")));
         // 查询文件夹底下所有文件
        Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder()
                .bucket("lab-test")
                .build());

        listObjects.forEach( itemResult -> {
            try {
                Item item = itemResult.get();
                System.out.println(item.objectName());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
        //移除文件
        minioClient.removeObject(RemoveObjectArgs.builder()
                .bucket("lab-test")
                .object("test.jpg")
                .build());

    }

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

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

相关文章

基础第二关:8G 显存玩转书生大模型 Demo

基础任务 复现过程 结果截图 进阶任务 任务一 复现过程 结果截图 任务二 复现过程 结果截图

OpenFoam waves2foam 虚拟机 镜像 下载 Ubuntu

编译完成截图及安装版本信息&#xff1a; 下载地址(资源整理不易&#xff0c;下载使用需付费&#xff0c;且文件较大&#xff0c;不能接受请勿浪费时间下载): 链接&#xff1a;https://pan.baidu.com/s/1j0-MYpaG2rTYuizSWPFcxg?pwdmoxv 提取码&#xff1a;moxv

【String的介绍及使用】

String的介绍及使用 ## 小杨 为何学习string以及string的简单介绍 学习string类的原因 C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c; 但是这些库函数与字符串是分离开的&am…

详解基于百炼平台及函数计算快速上线网页AI助手

引言 在当今这个信息爆炸的时代&#xff0c;用户对于在线服务的需求越来越趋向于即时性和个性化。无论是寻找产品信息、解决问题还是寻求建议&#xff0c;人们都期望能够获得即时反馈。这对企业来说既是挑战也是机遇——如何在海量信息中脱颖而出&#xff0c;提供高效且贴心的…

【C语言】fseek、ftell以及rewind函数(随机文件读写)

文章目录 前言1. fseek1.1 fseek函数原型1.2 fseek函数的形式参数1.3 fseek实例演示 2. ftell2.1 ftell函数原型2.2 ftell函数的实例演示 3. rewind3.1 rewind函数原型3.2 rewind函数实例演示 前言 在之前&#xff0c;我讲过文件的顺序读写。但是我们可不可以随机读写文件呢&a…

PCL从理解到应用【09】 点云特征 | 关键点提取 | 方法汇总

前言 在PCL中&#xff0c;有多种方法和函数可以用来提取点云特征&#xff0c;本文介绍关键点提取。 提取点云关键点&#xff0c;本文介绍的方法包括&#xff1a;SIFT、Harris、NARF、ISS和SUSAN。 Harris 提取点云关键点&#xff0c;效果如下图所示&#xff1a; 白色点是原始…

MATLAB预测模型(2)

一、前言 在MATLAB中&#xff0c;进行线性回归、非线性回归以及统计回归预测可以通过多种方法实现&#xff0c;包括使用内置函数和自定义函数。下面&#xff0c;我将分别给出线性回归、非线性回归和基于统计回归进行预测的基本示例代码。 二、实现 1. 线性回归 MATLAB中的poly…

机器人主板维修|ABB机械手主板元器件故障

【ABB机器人电路板故障原因诊断】 针对上述故障现象&#xff0c;我们需要对ABB机器人IO板进行详细的故障诊断。以下是一些可能的故障原因&#xff1a; 1. 元器件老化或损坏&#xff1a;ABB机械手安全面板上的元器件在长期使用过程中可能出现老化、损坏或接触不良等问题&#xf…

PyCharm运行Python的Flask项目时,愚蠢的执行了默认Flask框架默认配置处理

一&#xff1a;问题描述 因为上半年开始学习完python后&#xff0c;开始转人工智能方向的工作内容&#xff0c;所以这半年几乎在攻关python以及人工智能方向的技能&#xff0c;但是我有喜欢用Java的一些开发的爽点。 最近整Flask的框架时发现了一个问题&#xff0c;我就在Fla…

【数据结构算法经典题目刨析(c语言)】反转链表(图文详解)

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 目录 一、题目描述 二、思路分析 三、代码实现 一、题目描述&#xff1a; 二、思路分析 &#xff1a; 通过三个指针n1,n2,n3来实现链表的反转 1.首先初始化 n1为…

IO流相关

1. IO概述 Java中I/O操作主要是指使用java.io包下的内容&#xff0c;进行输入、输出操作。输入也叫做读取数据&#xff0c;输出也叫做作写出数据。 1.1 IO的分类 根据数据的流向分为&#xff1a;输入流和输出流。 输入流 &#xff1a;把数据从其他设备上读取到内存中的流。 …

力扣SQL50 好友申请 II :谁有最多的好友 UNION ALL

Problem: 602. 好友申请 II &#xff1a;谁有最多的好友 &#x1f468;‍&#x1f3eb; 参考题解 功能概述&#xff1a; 该查询统计 RequestAccepted 表中用户&#xff08;作为请求方或接受方&#xff09;出现的总次数&#xff0c;并找出出现次数最多的用户ID。 执行步骤&a…

PHP语言的学习(ctfshow中web入门web93~web104)

PHP语言基础知识&#xff08;超详细&#xff09;_php开发知识-CSDN博客 PHP特性之CTF中常见的PHP绕过-CSDN博客 浅谈PHP代码执行中出现过滤限制的绕过执行方法_php过滤绕过-CSDN博客 php代码审计(适合小白入门)_php审计入门-CSDN博客 什么是PHP&#xff1f; PHP 是一种脚本…

File 类练习

练习1&#xff1a;在当前模块下的aaa文件夹中创建一个a.txt文件。 分析&#xff1a;当前模块下是没有aaa文件夹的&#xff0c;这里我是手动在当前模块下创建了aaa文件夹&#xff0c;然后在指定a.txt的路径&#xff0c;再createNewFile()的。 public class File1 {public stat…

一键重装系统哪个软件好用_2024年一键重装系统工具排行榜

一键重装系统哪个软件好&#xff1f;现在市面上重装软件五花八门&#xff0c;有些网友不知道哪些好用&#xff0c;下面小编就为大家整理几款不错的电脑一键重新系统软件供大家选择&#xff0c;现整理2024年一键重装系统软件排行。 一键重装系统哪个软件好用&#xff1f; 一键重…

如何系统地自学Python?AI的回答让你少走三年弯路!

系统地自学Python是一个循序渐进的过程&#xff0c;需要掌握基础知识、进阶技能以及实践项目。以下是一个详细的自学Python的指南&#xff1a; 一、学习准备<末尾有AI整理的学习资料、电子书籍、实战项目> 了解Python&#xff1a; Python是一种流行的编程语言&#xff…

入门 PyQt6 看过来(案例)22~ 图表案例

​ ​ def showPie(self):"""绘制饼状图"""# &#xff08;1&#xff09;创建图表和视图chart QChart()chart.setTitle(中国高等教育普及率)chart.legend().setAlignment(Qt.AlignmentFlag.AlignLeft)chartView QChartView(self) # 必须有sel…

CookieMaker工作室合作开发C++项目十一:拟态病毒

&#xff08;注&#xff1a;本文章使用了“无标题技术”&#xff09; 一天&#xff0c;我和几个同事&#xff0c;平台出了点BUG&#xff0c;居然给我刷出了千年杀&#xff0c;同事看得瑕疵欲裂&#xff0c;发誓要将我挫骨扬灰—— &#xff08;游戏入口&#xff1a;和平精英31.…

iOS技术之安装nvmnode完整步骤

1.前提 首先电脑里得有brew、git、vscode这些工具, 当然了要用nvm&node肯定是需要这些基本开发工具 2.删除node环境 如果mac里没有安装过node、npm可以无视直接去 3 安装nvm。 为了保证安装nvm能够成功管理node&#xff0c;必须把电脑里之前安装的node全部清理&#xf…

微信小程序css中配置了文字超出一行或两行则显示省略号对纯数字或纯字母或小数点无效的解决办法

配置了文字超出一行或两行则显示省略号对纯数字或纯字母或小数点无效的解决办法 overflow_title{display: -webkit-box;-webkit-line-clamp: 1;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis; }只需要加上这两行css代码即可 word-break:break-all;…