当前位置: 首页 > news >正文

Java之MinIO存储桶和对象API使用

环境搭建

创建一个 maven项目,引入依赖:

    <!-- minio依赖--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.3</version></dependency><!-- 官方 miniodemo需要的依赖--><dependency><groupId>me.tongfei</groupId><artifactId>progressbar</artifactId><version>0.7.4</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.2</version></dependency>

这里我把 官方demo 放到了我的项目中,所以必须引入 progressbar依赖。否则忽略它。

初始化Minio客户端

注意:
新版 MinIO 采用 Builder构建者模式来构造 MinioClient对象。
API端口和 访问控制台端口不要搞混了

    // 初始化Minio客户端MinioClient minioClient = MinioClient.builder().endpoint("http://xxx.xxx.xxx.xxx:9000/").credentials("admin", "xxx").build();System.out.println(minioClient);

获取到 MinioClient对象,就可以进行 MinIO的 API操作使用了。

存储桶基本使用

1、检查存储桶是否存在
boolean bucketExists(BucketExistsArgs args):检查存储桶是否存在。

BucketExistsArgs btest2 = BucketExistsArgs.builder().bucket("btest2").build();
boolean existFlag = minioClient.bucketExists(btest2);

2、创建存储桶
public void makeBucket(MakeBucketArgs args):创建一个启用给定区域和对象锁定功能的存储桶。
示例1:存储桶不存在则创建

String bucketName = "java.minio.demo";
// 存储桶不存在则创建
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
System.out.printf("%s,创建成功", bucketName);
}else{
System.out.printf("%s,已存在", bucketName);
}

3、查询存储桶
3.1 查询所有桶的列表信息
public List listBuckets():列出所有桶的桶信息。
示例:

List<Bucket> bucketList = minioClient.listBuckets();
bucketList.forEach(bucket -> {
System.out.printf("存储桶名:%s,创建时间:%s ", bucket.name(), bucket.creationDate());
});

注意:桶的创建时间默认是美国时间,创建桶时我们可以指定桶的时区或者设置 MinIO服务器时区。

3.2查询所有桶的列表信息

Iterable<Result<Item>> otatest = minioClient.listObjects(ListObjectsArgs.builder().bucket("otatest").build());otatest.forEach(v->{try {//文件名System.out.println(v.get().objectName());System.out.println(v.get().userMetadata());} catch (Exception e) {e.printStackTrace();}});

4、删除存储桶
public void removeBucket(RemoveBucketArgs args):删除一个空桶。
示例:

String bucketName2 = "btest3";
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName2).build());

对象基本使用

1、上传对象
1.1 PutObject方法
public ObjectWriteResponse putObject(PutObjectArgs args):将给定的流上传为存储桶中的对象。
示例1,InputStream上传:

        String bucketName = "java.minio.demo";// 创建InputStream上传File file = new File("D:\Files\demo.jpg");InputStream inputStream = new FileInputStream(file);long start = System.currentTimeMillis();// 上传流minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object("2023/02/25/" + file.getName()).stream(inputStream, inputStream.available(), -1).build());inputStream.close();System.out.println("uploaded successfully 耗时:" + (System.currentTimeMillis() - start));

注意:
添加的Object大小不能超过 5GB。
默认情况下,如果已存在同名Object且对该Object有访问权限,则新添加的Object将覆盖原有的Object,并返回 200 OK。
OSS没有文件夹的概念,所有资源都是以文件来存储,但您可以通过创建一个以正斜线(/)结尾,大小为 0的Object来创建模拟文件夹(指定 /后,默认会自动创建)

1.2 uploadObject方法
public void uploadObject(UploadObjectArgs args):将文件中的内容作为存储桶中的对象上传。
不太常用,一般适合上传磁盘文件(mc cp命令更方便)。
示例:

        String bucketName = "java.minio.demo";long start = System.currentTimeMillis();// 上传文件minioClient.uploadObject(UploadObjectArgs.builder().bucket(bucketName).object("2023/02/25/demo2.jpg").filename("D:\Files\demo.jpg").build());System.out.println("uploaded successfully 耗时:" + (System.currentTimeMillis() - start));

获取对象

2.1 getObject方法
public GetObjectResponse getObject(GetObjectArgs args):获取对象的数据。
示例:

		String bucketName = "java.minio.demo";// GetObjectResponse 继承了 InputStream类GetObjectResponse objectResponse = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object("2023/02/25/demo2.jpg").build());System.out.println(objectResponse.bucket());System.out.println(objectResponse.object());byte[] allBytes = objectResponse.readAllBytes();System.out.println(allBytes);// Close the input stream.objectResponse.close();

返回数据通过流的方式

@GetMapping("/multipart/test")public void test(HttpServletResponse response) {
GetObjectResponse objectResponse = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object("订餐.xlsx").build());
//        return new Result().ok(objectResponse);
//        return  new ResponseEntity<>(objectResponse, HttpStatus.OK);ServletOutputStream outputStream = response.getOutputStream();
//        PrintWriter writer = response.getWriter();byte[] buffer = new byte[1024];int len;//从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1while ((len = objectResponse.read(buffer)) > 0) {outputStream.write(buffer, 0, len);
//            writer.write(new String(buffer));}objectResponse.close();outputStream.close();}}

注意:
返回结果是 GetObjectResponse类,它继承了 InputStream类。
GetObjectResponse使用后返回必须关闭以释放网络资源。
此操作需要对此Object具有读权限

downloadObject方法

public void downloadObject(DownloadObjectArgs args):将对象的数据下载到磁盘

    String bucketName = "java.minio.demo";minioClient.downloadObject(DownloadObjectArgs.builder().bucket(bucketName).object("2023/02/25/demo2.jpg").filename("D:\Files\demo.jpg") // 必须指定文件名.build());

getPresignedObjectUrl方法

public String getPresignedObjectUrl(GetPresignedObjectUrlArgs args):获取 HTTP 方法、到期时间和自定义请求参数的对象的预签名 URL。
示例:返回获取文件对象的URL GET请求,此 URL过期时间为一分钟。

        String bucketName = "java.minio.demo";String objectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object("2023/02/25/demo2.jpg").method(Method.GET)//.expiry(60) // 单位秒.expiry(30, TimeUnit.SECONDS).build());System.out.println(objectUrl);

删除对象
4.1 removeObject方法
public void removeObject(RemoveObjectArgs args) :移除一个对象。

       String bucketName = "java.minio.demo";minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object("2023/02/25/demo2.jpg")//.versionId("my-versionid") //还可以删除指定版本号的对象.build());

removeObjects方法

public Iterable removeObjects(RemoveObjectsArgs args):懒惰地删除多个对象。它需要迭代返回的 Iterable 以执行删除。
示例:

        String bucketName = "java.minio.demo";// 构建需要删除的对象List<DeleteObject> objects = new LinkedList<>();objects.add(new DeleteObject("2023/02/25/demo1.jpg"));objects.add(new DeleteObject("2023/02/25/demo2.jpg"));objects.add(new DeleteObject("2023/02/25/demo3.jpg"));// 删除Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(objects).build());for (Result<DeleteError> result : results) {// 删除文件不存在时,不会报错DeleteError error = result.get();System.out.println("Error in deleting object " + error.objectName() + "; " + error.message());}
http://www.lryc.cn/news/20345.html

相关文章:

  • 如何用java实现同时进行多个请求,可以将它们并行执行,从而减少总共的请求时间。
  • 高端装备的AC主轴头结构
  • 【Proteus仿真】【51单片机】粮仓温湿度控制系统设计
  • 【LINUX】环境变量以及main函数的参数
  • 使用Pyparsing为嵌入式开发定义自己的脚本语言
  • C win32基础学习(二)
  • 理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?
  • 读书笔记//《数据分析之道》
  • 1个串口用1根线实现多机半双工通信+开机控制电路
  • KUKA机器人外部自动运行模式的相关信号配置
  • 【RabbitMQ笔记02】消息队列RabbitMQ七种模式之最简单的模式
  • Spring MVC 源码- RequestToViewNameTranslator 组件
  • Linux--TCP编程--0216 17
  • 关于设计模式的记录
  • Lambda-常见的函数式接口
  • P1196 [NOI2002] 银河英雄传说 带权并查集
  • 【项目实战】快来入门Groovy的基础语法吧
  • Mybatis中的动态SQL
  • VUE常用API
  • 25 openEuler管理网络-使用nmcli命令配置ip
  • 如何安装和使用A-ops工具?
  • MySql数据库环境部署
  • 极品笔记,阿里P7爆款《K8s+Jenkins》技术笔记,职场必备
  • 数据结构:各种排序方法的综合比较
  • 【设计模式】 策略模式介绍及C代码实现
  • 【数据库】第二章 关系数据库
  • oracle和mysql的分页
  • 深拷贝与浅拷贝的理解
  • Shell变量
  • Android 8请求权限时弹窗BUG