springboot(3.2.5)初步集成MinIO(8.5.9)开发记录

springboot初步集成MinIO开发记录

  • 说明
  • 一:引入maven依赖
  • 二:手动注入minioClient
  • 三:创建service类
  • 四:测试打印连接信息
  • 五:时区转化工具类
  • 六:常用操作演示

说明

  • 这里只是作者开发的记录,已备将来完善和复习!内容很简单,大佬请路过。

一:引入maven依赖

  • 在项目pom中添加minio maven依赖
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.9</version>
</dependency>

二:手动注入minioClient

  • 由于minio官方没有提供spring-boot-starter-minio的启动类,所以,这里选择手动注入!
  • 在项目根目录下创建config软件包,创建config
    在这里插入图片描述
import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class Config {//链式编程 构建MinioClient对象@Beanpublic MinioClient minioClient(){return MinioClient.builder()// .region("zh-east-8") 可选注意和minio的区域配置一致.endpoint("http://ip:9000").credentials("minioadmin","minioadmin") // 默认 用户和秘密.build();}
}

三:创建service类

在这里插入图片描述

import io.minio.MinioClient;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;@Service
public class MinioService {@Resourceprivate MinioClient minioClient;public void testMinioClient(){System.out.print(minioClient);}
}

四:测试打印连接信息

  • 在测试类中测试打印连接信息
@SpringBootTest
class MinioApplicationTests {@Resourceprivate MinioService minioService;@Resourceprivate MinioClient minioClient;@Testvoid test() {minioService.testMinioClient();}
}	
  • 测试结果
io.minio.MinioClient@7302ff13

五:时区转化工具类

  • 如果你困惑于文件最后修改时间和代码程序查询结果不一致,参看Minio(官方docker版)容器部署时区问题研究记录
    在这里插入图片描述
package com.yang.miniostudy01.utils;import java.lang.annotation.Retention;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;public class TimeConverter {// 使用自定义格式化模式private static final DateTimeFormatter isoFormatter = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE).appendLiteral('T').append(DateTimeFormatter.ISO_LOCAL_TIME).optionalStart().appendOffsetId().optionalEnd().toFormatter();private static final DateTimeFormatter customFormatter = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE).appendLiteral('T').append(DateTimeFormatter.ISO_LOCAL_TIME).appendLiteral('Z') // 添加字面值 'Z' 表示时区偏移量.toFormatter();/*** 将UTC时间转换为指定时区的时间,格式保持ISO-8601 默认时区为东八区* @param utcTimeString UTC时间字符串(ISO-8601格式)* @return 指定时区的时间字符串(ISO-8601格式)*/public static String convertUtcToLocal(String utcTimeString) {String zoneIdString="Asia/Shanghai";return convertUtcToLocal(utcTimeString,zoneIdString);}/*** 将UTC时间转换为指定时区的时间,格式保持ISO-8601* @param utcTimeString UTC时间字符串(ISO-8601格式)* @param zoneIdString 时区ID,如"Asia/Shanghai"* @return 指定时区的时间字符串(ISO-8601格式)*/public static String convertUtcToLocal(String utcTimeString, String zoneIdString) {Instant utcTime = Instant.parse(utcTimeString);ZonedDateTime localTime = utcTime.atZone(ZoneId.of(zoneIdString));DateTimeFormatter formatter = customFormatter.withZone(ZoneId.of(zoneIdString));return formatter.format(localTime);}/*** 将本地时间转换为UTC时间* @param localTimeString 本地时间字符串(ISO-8601格式)* @param zoneIdString 时区ID,如"Asia/Shanghai"* @return UTC时间字符串(ISO-8601格式)*/public static String convertLocalToUtc(String localTimeString) {String zoneIdString="Asia/Shanghai";return convertLocalToUtc(localTimeString,zoneIdString);}/*** 将本地时间转换为UTC时间* @param localTimeString 本地时间字符串(ISO-8601格式)* @param zoneIdString 时区ID,如"Asia/Shanghai"* @return UTC时间字符串(ISO-8601格式)*/public static String convertLocalToUtc(String localTimeString, String zoneIdString) {ZonedDateTime localTime = ZonedDateTime.parse(localTimeString, customFormatter.withZone(ZoneId.of(zoneIdString)));Instant utcTime = localTime.toInstant();return isoFormatter.format(utcTime.atZone(ZoneId.of("UTC")));}
}

六:常用操作演示

package com.yang.miniostudy01;import com.yang.miniostudy01.service.MinioService;
import com.yang.miniostudy01.utils.TimeConverter;
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;@SpringBootTest
class MinioApplicationTests {@Resourceprivate MinioService minioService;@Resourceprivate MinioClient minioClient;/*** 判断桶是否存在*/@Testvoid testBucketExists(){try {boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test1").build());System.out.println("桶存在:"+exists);} catch (ErrorResponseException | XmlParserException | InsufficientDataException | InternalException |ServerException | InvalidKeyException | InvalidResponseException | IOException |NoSuchAlgorithmException e) {throw new RuntimeException(e);}}/*** 创建桶*/@Testvoid testBucketCreate() throws Exception {boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test02").build());if (!exists){minioClient.makeBucket(MakeBucketArgs.builder().bucket("test02").build());}System.out.println("bucket已存在,无需创建");}/*** 获取桶列表*/@Testvoid testBucketList() throws Exception {List<Bucket> buckets = minioClient.listBuckets();buckets.forEach(bucket-> System.out.println(bucket.name()+"--"+bucket.creationDate()));}/*** 删除桶*/@Testvoid testBucketRemove() throws Exception {minioClient.removeBucket(RemoveBucketArgs.builder().bucket("test02").build());}/*** 上传文件*/@Testvoid testObjectPut() throws Exception{File file = new File("src/main/resources/picture/image.jpg");ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder().bucket("test02").object("image.jpg").stream(new FileInputStream(file),file.length(),-1).build());System.out.print(response);}/*** 简单上传文件*/@Testvoid testObjectUpload() throws Exception {ObjectWriteResponse response = minioClient.uploadObject(UploadObjectArgs.builder().bucket("test02").object("image3.jpg").filename("src/main/resources/picture/image.jpg").build());System.out.println(response);}/*** 判断文件是否存在*/@Testvoid testObjectExists() throws Exception {StatObjectResponse response = minioClient.statObject(StatObjectArgs.builder().bucket("test02").object("image.jpg").build());System.out.println("修改前文件信息:"+response);String localLastModifiedTime = TimeConverter.convertUtcToLocal(response.lastModified().toString());ZonedDateTime localLastModified = ZonedDateTime.parse(localLastModifiedTime);//通过反射 修改文件信息 不影响minio存储的文件信息try {Field lastModifiedField = response.getClass().getDeclaredField("lastModified");lastModifiedField.setAccessible(true);lastModifiedField.set(response, localLastModified);} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}System.out.println("修改后文件信息:"+response);}/*** 获取文件访问路径*/@Testvoid testObjectUrl() throws Exception {String objectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket("test02").object("image.jpg").method(Method.GET).expiry(5, TimeUnit.MINUTES).build());System.out.println(objectUrl);}/*** 配置桶自定义权限*/@Testvoid testBucketCreateWithPrivilege() throws Exception {String bucketName="test02";boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if (!exists){minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}else{System.out.println("bucket已存在,无需创建");}// 定义存储桶的访问策略为公开// 定义公共访问策略String policyJson = "{\n" +"    \"Version\": \"2012-10-17\",\n" +"    \"Statement\": [\n" +"        {\n" +"            \"Sid\": \"PublicRead\",\n" +"            \"Effect\": \"Allow\",\n" +"            \"Principal\": \"*\",\n" +"            \"Action\": \"s3:GetObject\",\n" +"            \"Resource\": \"arn:aws:s3:::" + bucketName + "/*\"\n" +"        }\n" +"    ]\n" +"}";minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(policyJson).build());}/*** 文件下载*/@Testpublic void testObjectDownload() throws Exception {GetObjectResponse objectFile = minioClient.getObject(GetObjectArgs.builder().bucket("test02").object("image.jpg").build());System.out.println(objectFile.transferTo(new FileOutputStream("src/main/resources/picture/test.jpg")));}/*** 获取桶内文件信息*/@Testpublic void testObjectList(){Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket("test02").build());results.forEach((itemResult)->{try {Item item = itemResult.get();System.out.println(item.objectName()+" \t"+item.lastModified()+"\t"+item.size());} catch (ErrorResponseException | XmlParserException | ServerException | NoSuchAlgorithmException |InvalidResponseException | InsufficientDataException | InvalidKeyException | IOException |InternalException e) {throw new RuntimeException(e);}});}/*** 删除文件*/@Testpublic void testRemoveObject() throws Exception {minioClient.removeObject(RemoveObjectArgs.builder().bucket("test02").object("5g3pl8.jpg").build());}
}

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

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

相关文章

论文| Visual place recognition: A survey from deep learning perspective

2021-Visual place recognition: A survey from deep learning perspective

c++笔记——概述运算符重载——解析运算符重载的难点

前言:运算符重载是面向对象的一个重要的知识点。我们都知道内置类型可以进行一般的运算符的运算。但是如果是一个自定义类型&#xff0c; 这些运算符就无法使用了。那么为了解决这个问题&#xff0c; 我们的祖师爷就在c中添加了运算符重载的概念。 本篇主要通过实例的实现来讲述…

Facebook革命:数字社交的全新篇章

随着互联网的不断普及和科技的飞速发展&#xff0c;社交媒体已经成为现代社会不可或缺的一部分。在众多社交媒体平台中&#xff0c;Facebook以其广泛的用户群体和强大的功能而备受瞩目。然而&#xff0c;Facebook并非止步于现状&#xff0c;而是正在掀起一场数字社交的革命&…

Github 2024-05-07 开源项目日报 Tp10

根据Github Trendings的统计,今日(2024-05-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目4Jupyter Notebook项目2Python项目1Batchfile项目1非开发语言项目1Java项目1HTML项目1C#项目1从零开始构建你喜爱的技术 创建周期…

MySQL 高级 - 第七章 | 索引的数据结构

目录 一、为什么使用索引二、什么是索引2.1 索引的概述2.2 索引的优缺点 三、InnoDB 中索引的推演3.1 InnoDB 页简介3.2 没有索引的查找3.3 设计索引3.3.1 一个简单的索引设计方案3.3.2 InnoDB 中索引方案① 迭代 1 次&#xff1a;目录项记录的页② 迭代 2 次&#xff1a;多个目…

Java | Leetcode Java题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m matrix.length, n matrix[0].length;int low 0, high m * n - 1;while (low < high) {int mid (high - low) / 2 low;int x matrix[mid / n][m…

ubuntu20部署3d高斯

3d高斯的链接&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting 系统环境 ubuntu20的系统环境&#xff0c;打算只运行训练的代码&#xff0c;而不去进行麻烦的可视化&#xff0c;可视化直接在windows上用他们预编译好的exe去可视化。&#xff08;因为看的很…

TC4056 1A线性锂离子电池充电器芯片IC

一、产品描述 TC4056是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。其底部带有散热片的ESOP8/DIP8封装与较少的外部元件数目使得TC4056成为便携式应用的理想选择。TC4056可以适合USB电源和适配器电源工作。 由于采用了内部PMOS FET架构&#xff0…

基于单片机的无线数据传输系统设计

摘要:基于单片机的无线数据传输系统的设计,实现了温度和湿度的自动采集、无线通讯和报警功能。该系统包括了LCD1602显示电路、DHT11温湿度采集电路等,完成了基于无线数据传输的方法来实现温湿度的采集。 关键词:温湿度检测;N RF 24 L 01;单片机 0 引言 随着科技水平的提高,…

DMAR: [INTR-REMAP] Present field in the IRTE entry is clear 的解决办法

问题描述 在使用FPGA开发PCIe的MSI-X中断相关功能时&#xff0c;一次测试过程中dmesg打印出如下错误&#xff0c;使用cat /proc/interrupts查看FPGA的PCIe驱动程序未收到MSIX中断。使用的系统为基于Intel x86_64的linux&#xff08;RHEL8.9&#xff09;&#xff0c;基于Xilinx …

【边东随笔】北美鳄龟的生存智慧:细心 | 信心 | 狠心 | 耐心

非常谨慎&#xff0c;在水域中会先找到躲避将自身安置于有利地形 ( 细心 &#xff09;。 浮出水面换气&#xff0c;水体稍有异动就会退回水中&#xff0c;优秀掠食者对自身优势牢牢的把握&#xff08; 信心 &#xff09;。 非常优雅&#xff0c;猎食动作不存在任何花里胡哨&a…

解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题

这是一个版本问题 我用koa2和mysql2链接就没有问题 不知道这个老项目运行为啥有这个问题 解决方案 打开mysql运行这个两个命令&#xff1a; ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123321; FLUSH PRIVILEGES; 须知(给小白看的&#xff01;) …

【Pytorch】4.torchvision.datasets的使用

什么是torchvision.datasets、 是pytorch官方给出的关于cv领域的训练数据集&#xff0c;我们可以用官方提供的数据集进行学习与训练 如何查看 我们可以进入Pytorch官网 切换一下版本到v0.9.0&#xff0c;就可以看到官方给出的数据集了 同时也有官方训练好的cv模型可以供我们…

Unity 性能优化之图片优化(八)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、可以提前和美术商量的事1.避免内存浪费&#xff08;UI图片&#xff0c;不是贴图&#xff09;2.提升图片性能 二、图片优化1.图片Max Size修改&#x…

2024年全域电商矩阵109节线上课

《24年全域电商矩阵109节线上课》是一门全面介绍电子商务领域的课程。从电子商务的基本概念到全球电子商务趋势&#xff0c;再到电子商务的营销策略和实际操作技巧&#xff0c;本课程涵盖了丰富多样的主题。学员将通过109节在线课程系统全面了解电子商务&#xff0c;并获得在这…

AI换脸免费软件Rope中文汉化蓝宝石版本全新UI界面,修复部分已知错误【附下载地址与详细使用教程】

rope蓝宝石版&#xff1a;点击下载 注意&#xff1a;此版本支持N卡、A卡、CPU&#xff0c;且建议使用中高端显卡&#xff0c;系统要求win10及以上。 Rope-蓝宝石 更新内容&#xff1a; 0214版更新&#xff1a; ①&#xff08;已修复&#xff09;恢复到以前的模型荷载参数。有…

使用 Kubeadm 搭建个公网 k8s 集群(单控制平面集群)

前言 YY&#xff1a;国庆的时候趁着阿里云和腾讯云的轻量级服务器做促销一不小心剁了个手&#x1f60e;&#x1f622;&#xff0c;2 Cores&#xff0c;4G RAM 还是阔以的&#xff0c;既然买了&#xff0c;那不能不用呀&#x1f6a9;&#xff0c;之前一直想着搭建个 k8s 集群玩…

C语言——联合体和枚举

1. 联合体 联合体和结构体类似。 联合体类型的声明&#xff1a; 联合体的特点&#xff1a; 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以是不同的类型。 但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀…

UDP通讯的demo

udp通讯的demo&#xff0c;这个只是简单的实现。 后面我还会加入udp组播功能。 因为懒&#xff0c;所以我自己发&#xff0c;自己接收了。 经过测试&#xff0c;可以看到&#xff0c;发送消息和接收消息功能都没问题。 广播&#xff1a; 这个是点对点的通过对方的ip和端口发…

Minio(官方docker版)容器部署时区问题研究记录

文章目录 感慨&概述补充&#xff1a;MINIO_REGION和容器时间的关系 问题一&#xff1a;minio容器和本地容器时间不一致问题说明原因探究解决方法结果验证 问题二&#xff1a;minio修改时间和本地查询结果不一致具体问题原因探究解决办法时间转化工具类调用测试和验证上传文…