java minio 分片上传工具类与测试demo

java minio 分片上传工具类与测试demo

  • 工具类方法
    • [1、presignedUrl 获取文件上传的预授权url](#1、presignedUrl 获取文件上传的预授权url)
    • [2、compose 合并文件,并获取合并后的文件的哈希值](#2、compose 合并文件,并获取合并后的文件的哈希值)
    • [3、removeBatch 批量删除分片文件](#3、removeBatch 批量删除分片文件)
  • 完整demo
  • 说明

工具类方法

1、presignedUrl 获取文件上传的预授权url

java 复制代码
	public static String presignedUrl(String customBucket,String object){
		String newBucket = bucketName;
		if(StringUtils.isNotEmpty(customBucket)){
			newBucket = customBucket;
		}

		// 获取上传URL(客户端直接上传)
		String uploadUrl = null;
		try {
			initMinio(minioUrl, minioName,minioPass);
			// 检查存储桶是否已经存在
			if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {

			} else {
				// 创建存储桶
				minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());
			}

			uploadUrl = minioClient.getPresignedObjectUrl(
					GetPresignedObjectUrlArgs.builder()
							.method(Method.PUT)
							.bucket(newBucket)
							.object(object)
							.expiry(15, TimeUnit.MINUTES)  // 15分钟有效
							.build());
		} catch (ErrorResponseException e) {
			throw new RuntimeException(e);
		} catch (InsufficientDataException e) {
			throw new RuntimeException(e);
		} catch (InternalException e) {
			throw new RuntimeException(e);
		} catch (InvalidKeyException e) {
			throw new RuntimeException(e);
		} catch (InvalidResponseException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException(e);
		} catch (XmlParserException e) {
			throw new RuntimeException(e);
		} catch (ServerException e) {
			throw new RuntimeException(e);
		}

		System.out.println("上传URL: " + uploadUrl);
		return uploadUrl;
	}

2、compose 合并文件,并获取合并后的文件的哈希值

java 复制代码
/**
	 * 合并文件并获取对象hash
	 * @param sourceObjectList
	 * @param customBucket
	 * @param object
	 * @return etag 对象的ETag(通常是MD5哈希)
	 */
	public static String compose(List<ComposeSource> sourceObjectList,String customBucket,String object){
		String newBucket = bucketName;
		if(StringUtils.isNotEmpty(customBucket)){
			newBucket = customBucket;
		}
		try {
			initMinio(minioUrl, minioName,minioPass);
			// 检查存储桶是否已经存在
			if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {

			} else {
				// 创建存储桶
				minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());
			}

			ObjectWriteResponse objectWriteResponse = minioClient.composeObject(
					ComposeObjectArgs.builder()
							.bucket(newBucket)
							.object(object)
							.sources(sourceObjectList)
							.build());
			return objectWriteResponse.etag();
		}catch (Exception e){
			e.printStackTrace();
		}
		return null;
	}

3、removeBatch 批量删除分片文件

java 复制代码
public static void removeBatch(String customBucket,List<String> objectList){
		String newBucket = bucketName;
		if(StringUtils.isNotEmpty(customBucket)){
			newBucket = customBucket;
		}

		// 获取上传URL(客户端直接上传)
		String uploadUrl = null;
		try {
			initMinio(minioUrl, minioName,minioPass);
			// 检查存储桶是否已经存在
			if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {

			} else {
				// 创建存储桶
				minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());
			}

			// 转换为DeleteObject列表
			List<DeleteObject> objects = objectList.stream()
					.map(DeleteObject::new)
					.collect(Collectors.toList());

			// 批量删除
			Iterable<Result<DeleteError>> results = minioClient.removeObjects(
					RemoveObjectsArgs.builder()
							.bucket(bucketName)
							.objects(objects)
							.build()
			);
			// 检查删除结果
			for (Result<DeleteError> result : results) {
				DeleteError error = result.get();
				if (error == null) {
					System.out.println("成功删除:" + error.objectName());
				} else {
					System.err.println("Error deleting object: " + error.objectName() +
							" - " + error.message());
				}
			}
		} catch (ServerException e) {
			throw new RuntimeException(e);
		} catch (InsufficientDataException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException(e);
		} catch (InvalidKeyException e) {
			throw new RuntimeException(e);
		} catch (XmlParserException e) {
			throw new RuntimeException(e);
		} catch (InternalException e) {
			throw new RuntimeException(e);
		} catch (ErrorResponseException e) {
			throw new RuntimeException(e);
		} catch (InvalidResponseException e) {
			throw new RuntimeException(e);
		}
	}

完整demo

https://download.csdn.net/download/weixin_44957529/92640261

说明

为什么要用预授权url

  • 前端直接访问minio服务,减少后端服务器压力
  • 使用预授权url上传,能得到分片文件的标准哈希值,而使用MinioUtil.upload()上传时,获取的不是标准哈希值
相关推荐
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚8 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白9 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地11 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415911 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风14 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898614 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112315 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员15 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus