From 1951c21355708c0cabb819949712c2360f567ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Fri, 12 Apr 2024 11:17:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E9=87=8D=E5=86=99=EF=BC=8C=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DatasetServiceImpl.java | 34 ++---- .../service/impl/MinioServiceImpl.java | 4 +- .../service/impl/ModelsServiceImpl.java | 41 ++----- .../com/ruoyi/platform/utils/MinioUtil.java | 111 +++++++++++++++++- 4 files changed, 129 insertions(+), 61 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java index 631f2eb3..76dd8c40 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java @@ -9,6 +9,7 @@ import com.ruoyi.platform.mapper.DatasetDao; import com.ruoyi.platform.mapper.DatasetVersionDao; import com.ruoyi.platform.service.DatasetService; import com.ruoyi.platform.service.DatasetVersionService; +import com.ruoyi.platform.service.MinioService; import com.ruoyi.platform.utils.BeansUtils; import com.ruoyi.platform.utils.FileUtil; import com.ruoyi.platform.utils.MinioUtil; @@ -56,6 +57,9 @@ public class DatasetServiceImpl implements DatasetService { @Resource private DatasetVersionService datasetVersionService; + @Resource + private MinioService minioService; + // 固定存储桶名 private final String bucketName = "platform-data"; @@ -209,39 +213,16 @@ public class DatasetServiceImpl implements DatasetService { */ @Override public List> uploadDataset(MultipartFile[] files, String uuid) throws Exception { - List> results = new ArrayList<>(); -// //时间戳统一定在外面,一次上传就定好 -// Date createTime = new Date(); -// String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); + List> results = new ArrayList<>(); for (MultipartFile file:files){ - if (file.isEmpty()) { - throw new Exception("文件为空,无法上传"); - } - // 获取文件大小并转换为可读形式 - long sizeInBytes = file.getSize(); - String formattedSize = FileUtil.formatFileSize(sizeInBytes); // 格式化文件大小 - - // 其余操作基于 modelsVersionToUse + // 构建objectName String username = SecurityUtils.getLoginUser().getUsername(); String fileName = file.getOriginalFilename(); String objectName = "datasets/" + username + "/" + uuid + "/" + fileName; - - // 上传文件到MinIO并将记录新增到数据库中 - try (InputStream inputStream = file.getInputStream()) { - minioUtil.uploadObject(bucketName, objectName, inputStream); - - Map fileResult = new HashMap<>(); - fileResult.put("fileName", file.getOriginalFilename()); - fileResult.put("url", objectName); // objectName根据实际情况定义 - fileResult.put("fileSize", formattedSize); - results.add(fileResult); - } catch (Exception e) { - throw new Exception("上传数据集失败: " + e.getMessage(), e); - } + results.add(minioService.uploadFile(bucketName, objectName, file)); } return results; - } @@ -308,6 +289,7 @@ public class DatasetServiceImpl implements DatasetService { List datasetVersionVos = datasetVo.getDatasetVersionVos(); if (datasetVersionVos==null || datasetVersionVos.isEmpty()){ throw new Exception("数据集版本信息错误"); + } Dataset dataset = new Dataset(); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MinioServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MinioServiceImpl.java index 82ecd068..f6e0c0b5 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MinioServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/MinioServiceImpl.java @@ -50,7 +50,7 @@ public class MinioServiceImpl implements MinioService { } @Override - public Map uploadFile(String bucketName, String objectName,MultipartFile file ) throws Exception { + public Map uploadFile(String bucketName, String objectName, MultipartFile file ) throws Exception { if (file.isEmpty()) { throw new Exception("文件为空,无法上传"); } @@ -65,7 +65,7 @@ public class MinioServiceImpl implements MinioService { result.put("url", objectName); // objectName根据实际情况定义 result.put("fileSize", formattedSize); } catch (Exception e) { - throw new Exception("上传数据集失败: " + e.getMessage(), e); + throw new Exception("上传文件失败: " + e.getMessage(), e); } return result; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java index ca6b07e4..52dea672 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ModelsServiceImpl.java @@ -5,6 +5,7 @@ import com.ruoyi.platform.domain.Models; import com.ruoyi.platform.domain.ModelsVersion; import com.ruoyi.platform.mapper.ModelsDao; import com.ruoyi.platform.mapper.ModelsVersionDao; +import com.ruoyi.platform.service.MinioService; import com.ruoyi.platform.service.ModelsService; import com.ruoyi.platform.service.ModelsVersionService; import com.ruoyi.platform.utils.BeansUtils; @@ -52,6 +53,9 @@ public class ModelsServiceImpl implements ModelsService { @Resource private ModelsVersionService modelsVersionService; + @Resource + private MinioService minioService; + // 固定存储桶名 private final String bucketName = "platform-data"; @@ -194,50 +198,23 @@ public class ModelsServiceImpl implements ModelsService { } /** - * 上传模型 + * 上传模型文件 * * @param files 文件 - * @param uuid + * @param uuid 唯一标识 * @return 是否成功 */ @Override public List> uploadModels(MultipartFile[] files, String uuid) throws Exception { List> results = new ArrayList<>(); -// //时间戳统一定在外面,一次上传就定好 -// Date createTime = new Date(); -// String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(createTime); - - for (MultipartFile file:files){ - if (file.isEmpty()) { - throw new Exception("文件为空,无法上传"); - } - // 获取文件大小并转换为KB - long sizeInBytes = file.getSize(); - String formattedSize = FileUtil.formatFileSize(sizeInBytes); // 格式化文件大小 - - - - - // 其余操作基于 modelsVersionToUse + for (MultipartFile file:files) { + // 构建objectName String username = SecurityUtils.getLoginUser().getUsername(); String fileName = file.getOriginalFilename(); String objectName = "models/" + username + "/" + uuid + "/" + fileName; - - // 上传文件到MinIO并将记录新增到数据库中 - try (InputStream inputStream = file.getInputStream()) { - minioUtil.uploadObject(bucketName, objectName, inputStream); -// - Map fileResult = new HashMap<>(); - fileResult.put("fileName", file.getOriginalFilename()); - fileResult.put("url", objectName); // objectName根据实际情况定义 - fileResult.put("fileSize", formattedSize); - results.add(fileResult); - } catch (Exception e) { - throw new Exception("上传模型失败: " + e.getMessage(), e); - } + results.add(minioService.uploadFile(bucketName, objectName, file)); } - return results; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java index ccfc1712..fde4180f 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java @@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.nio.charset.StandardCharsets; @@ -23,7 +24,7 @@ import java.util.zip.ZipOutputStream; @Component public class MinioUtil { - private MinioClient minioClient; + private static MinioClient minioClient; @Autowired public MinioUtil(@Value("${minio.endpoint}")String minioEndpoint,@Value("${minio.accessKey}")String minioAccessKey,@Value("${minio.secretKey}") String minioSecretKey) { @@ -43,6 +44,84 @@ public class MinioUtil { minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); } + /** + * 验证bucketName是否存在 + * + * @return boolean true:存在 + */ + public boolean bucketExists(String bucketName) + throws Exception { + return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + } + + /** + * 判断文件是否存在 + * + * @param bucketName 存储桶 + * @param objectName 对象 + * @return true:存在 + */ + public static boolean doesObjectExist(String bucketName, String objectName) { + boolean exist = true; + try { + minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } catch (Exception e) { + exist = false; + } + return exist; + } + + /** + * 判断文件夹是否存在 + * + * @param bucketName 存储桶 + * @param objectName 文件夹名称(去掉/) + * @return true:存在 + */ + public static boolean doesFolderExist(String bucketName, String objectName) { + boolean exist = false; + try { + Iterable> results = minioClient.listObjects( + ListObjectsArgs.builder().bucket(bucketName).prefix(objectName).recursive(false).build()); + for (Result result : results) { + Item item = result.get(); + if (item.isDir() && objectName.equals(item.objectName())) { + exist = true; + } + } + } catch (Exception e) { + exist = false; + } + return exist; + } + + /** + * 根据文件前置查询文件 + * + * @param bucketName bucket名称 + * @param prefix 前缀 + * @param recursive 是否递归查询 + * @return MinioItem 列表 + */ + public static List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) throws Exception { + List list = new ArrayList<>(); + Iterable> objectsIterator = minioClient.listObjects( + ListObjectsArgs. + builder(). + bucket(bucketName). + prefix(prefix). + recursive(recursive). + build()); + if (objectsIterator != null) { + for (Result o : objectsIterator) { + Item item = o.get(); + list.add(item); + } + } + return list; + } + + public void uploadObject(String bucketName, String objectName, InputStream stream) throws Exception { long size = stream.available(); minioClient.putObject( @@ -54,6 +133,36 @@ public class MinioUtil { ); } + /** + * 通过MultipartFile,上传文件 + * + * @param bucketName 存储桶 + * @param file 文件 + * @param objectName 对象名 + * @param contentType 文件类型 + */ + public static ObjectWriteResponse putObject(String bucketName, MultipartFile file, String objectName, String contentType) throws Exception { + InputStream inputStream = file.getInputStream(); + return minioClient.putObject( + PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType) + .stream(inputStream, inputStream.available(), -1).build()); + } + + /** + * 通过MultipartFile,上传文件 + * + * @param bucketName 存储桶 + * @param file 文件 + * @param objectName 对象名 + */ + public static ObjectWriteResponse putObject(String bucketName, MultipartFile file, String objectName) throws Exception { + InputStream inputStream = file.getInputStream(); + return minioClient.putObject( + PutObjectArgs.builder().bucket(bucketName).object(objectName) + .stream(inputStream, inputStream.available(), -1).build()); + } + + public void downloadObject(String bucketName, String objectName, OutputStream stream) throws Exception { try (InputStream inStream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build())) { byte[] buffer = new byte[1024]; From fe92b49d9085eb3f4a8638ff96c5fca0ce0cbd90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E5=A4=A7=E9=94=90?= <1070211640@qq.com> Date: Fri, 12 Apr 2024 17:34:21 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/dataset/DatasetController.java | 10 ++ .../platform/service/DatasetService.java | 2 + .../ruoyi/platform/service/MinioService.java | 1 + .../service/impl/DatasetServiceImpl.java | 36 ++++- .../com/ruoyi/platform/utils/MinioUtil.java | 139 +++++++++++++++++- 5 files changed, 173 insertions(+), 15 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetController.java index a54f41f4..ef1a709f 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/dataset/DatasetController.java @@ -194,6 +194,16 @@ public class DatasetController { } + + @GetMapping("/exportDataset") + @ApiOperation(value = "导出数据集", notes = "将流水线产物导出到数据集。") + public AjaxResult exportDataset(@RequestParam("path") String path, @RequestParam("uuid") String uuid) throws Exception { + return AjaxResult.success(datasetService.exportDataset(path, uuid)); + } + + + + /** * 从流水线上传数据集,不会给二进制文件,这边只存路径 * @return 上传结果 diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java index 96983b05..1ab61c27 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java @@ -82,4 +82,6 @@ DatasetService { public void checkDeclaredName(Dataset insert) throws Exception; ResponseEntity downloadAllDatasetFiles(Integer datasetId, String version) throws Exception; + + List> exportDataset(String path, String uuid) throws Exception; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/MinioService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/MinioService.java index bde70b6d..28cb0a79 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/MinioService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/MinioService.java @@ -11,4 +11,5 @@ public interface MinioService { ResponseEntity downloadZipFile(String bucketName , String path); Map uploadFile(String bucketName, String objectName, MultipartFile file ) throws Exception; + } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java index 76dd8c40..427a3def 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/DatasetServiceImpl.java @@ -16,6 +16,7 @@ import com.ruoyi.platform.utils.MinioUtil; import com.ruoyi.platform.vo.VersionVo; import com.ruoyi.platform.vo.DatasetVo; import com.ruoyi.system.api.model.LoginUser; +import io.minio.messages.Item; import org.apache.commons.lang3.StringUtils; import org.springframework.core.io.InputStreamResource; import org.springframework.data.domain.Page; @@ -208,12 +209,11 @@ public class DatasetServiceImpl implements DatasetService { * 上传数据集 * * @param files 文件 - * @param uuid + * @param uuid 唯一标识 * @return 是否成功 */ @Override public List> uploadDataset(MultipartFile[] files, String uuid) throws Exception { - List> results = new ArrayList<>(); for (MultipartFile file:files){ // 构建objectName @@ -267,19 +267,15 @@ public class DatasetServiceImpl implements DatasetService { public List getDatasetVersions(Integer datasetId) throws Exception { // 获取所有相同模型ID的记录 List versions = datasetVersionDao.queryByDatasetId(datasetId); - if (versions.isEmpty()) { throw new Exception("未找到相关数据集版本记录"); } - // 使用Stream API提取version字段,并去重 return versions.stream() .map(DatasetVersion::getVersion) // 提取每个DatasetVersion对象的version属性 .filter(version -> version != null && !version.isEmpty()) //忽略null或空字符串的version .distinct() // 去重 .collect(Collectors.toList()); // 收集到List中 - - } @@ -316,7 +312,6 @@ public class DatasetServiceImpl implements DatasetService { throw new Exception("新增数据集版本失败"); } } - return "新增数据集成功"; } @@ -378,7 +373,6 @@ public class DatasetServiceImpl implements DatasetService { zos.closeEntry(); } } - // 转换为输入流 ByteArrayInputStream inputStream = new ByteArrayInputStream(baos.toByteArray()); InputStreamResource resource = new InputStreamResource(inputStream); @@ -394,4 +388,30 @@ public class DatasetServiceImpl implements DatasetService { } } + @Override + public List> exportDataset(String path, String uuid) throws Exception { + List> results = new ArrayList<>(); + //根据path得到源文件所在桶名 + String srcBucketName = path.substring(0, path.indexOf("/")); + //构建目标目录路径 + String username = SecurityUtils.getLoginUser().getUsername(); + String targetDir = "datasets/" + username + "/" + uuid; + // 递归拷贝整个原目录到目标目录下 + minioUtil.copyDirectory(srcBucketName, path, bucketName, targetDir); + List movedItems = minioUtil.getAllObjectsByPrefix(bucketName, targetDir, true); + for (Item movedItem : movedItems) { + Map result = new HashMap<>(); + String url = movedItem.objectName(); + String fileName = extractFileName(url); + // 获取文件大小并转换为可读形式 + long sizeInBytes = movedItem.size(); + String formattedSize = FileUtil.formatFileSize(sizeInBytes); // 格式化文件大小 + result.put("fileName", fileName); + result.put("url", url); // objectName根据实际情况定义 + result.put("fileSize", formattedSize); + results.add(result); + } + return results; + } + } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java index fde4180f..bc5b234b 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/utils/MinioUtil.java @@ -3,6 +3,7 @@ package com.ruoyi.platform.utils; import io.minio.*; import io.minio.errors.MinioException; +import io.minio.messages.DeleteObject; import io.minio.messages.Item; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -14,10 +15,7 @@ import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @Slf4j @@ -61,7 +59,7 @@ public class MinioUtil { * @param objectName 对象 * @return true:存在 */ - public static boolean doesObjectExist(String bucketName, String objectName) { + public boolean doesObjectExist(String bucketName, String objectName) { boolean exist = true; try { minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); @@ -78,7 +76,7 @@ public class MinioUtil { * @param objectName 文件夹名称(去掉/) * @return true:存在 */ - public static boolean doesFolderExist(String bucketName, String objectName) { + public boolean doesFolderExist(String bucketName, String objectName) { boolean exist = false; try { Iterable> results = minioClient.listObjects( @@ -103,7 +101,7 @@ public class MinioUtil { * @param recursive 是否递归查询 * @return MinioItem 列表 */ - public static List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) throws Exception { + public List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) throws Exception { List list = new ArrayList<>(); Iterable> objectsIterator = minioClient.listObjects( ListObjectsArgs. @@ -173,6 +171,102 @@ public class MinioUtil { } } + /** + * 创建文件夹或目录 + * + * @param bucketName 存储桶 + * @param objectName 目录路径 + */ + public ObjectWriteResponse putDirObject(String bucketName, String objectName) throws Exception { + return minioClient.putObject( + PutObjectArgs.builder().bucket(bucketName).object(objectName).stream( + new ByteArrayInputStream(new byte[]{}), 0, -1).build()); + } + + /** + * 拷贝文件 + * + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param srcBucketName 目标bucket名称 + * @param srcObjectName 目标文件名称 + */ + public ObjectWriteResponse copyObject(String bucketName, String objectName, + String srcBucketName, String srcObjectName) throws Exception { + return minioClient.copyObject( + CopyObjectArgs.builder() + .source(CopySource.builder().bucket(bucketName).object(objectName).build()) + .bucket(srcBucketName) + .object(srcObjectName) + .build()); + } + + + + /** + * 递归拷贝 + * + * @param sourceBucketName 源bucket名称 + * @param sourceKeyPrefix 源目录路径 + * @param targetBucketName 目标bucket名称 + * @param targetKeyPrefix 目标目录名称 + */ + public void copyDirectory(String sourceBucketName, String sourceKeyPrefix, + String targetBucketName, String targetKeyPrefix) throws Exception { + // 列出所有源目录下的对象 + Iterable> results = minioClient.listObjects(ListObjectsArgs.builder() + .bucket(sourceBucketName) + .prefix(sourceKeyPrefix) + .recursive(true) + .build()); + + for (Result result : results) { + Item item = result.get(); + String sourceKey = item.objectName(); //文件的原始完整路径 + String targetKey = targetKeyPrefix + sourceKey.substring(sourceKeyPrefix.length()); + + // 拷贝每个对象到目标路径 + minioClient.copyObject(CopyObjectArgs.builder() + .bucket(targetBucketName) + .object(targetKey) + .source(CopySource.builder() + .bucket(sourceBucketName) + .object(sourceKey) + .build()) + .build()); + } + } + + + + + + /** + * 获取文件流 + * + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @return 二进制流 + */ + public static InputStream getObject(String bucketName, String objectName) throws Exception { + return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } + + /** + * 断点下载 + * + * @param bucketName bucket名称 + * @param objectName 文件名称 + * @param offset 起始字节的位置 + * @param length 要读取的长度 + * @return 流 + */ + public InputStream getObject(String bucketName, String objectName, long offset, long length) + throws Exception { + return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).offset(offset).length(length).build()); + } + + public List listFilesInDirectory(String bucketName, String prefix) throws Exception { List fileInfoList = new ArrayList<>(); @@ -198,6 +292,37 @@ public class MinioUtil { return fileInfoList; } + /** + * 删除文件 + * + * @param bucketName bucket名称 + * @param objectName 文件名称 + */ + public static void removeObject(String bucketName, String objectName) throws Exception { + minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } + + + /** + * 批量删除文件 + * + * @param bucketName bucket + * @param keys 需要删除的文件列表 + */ + public static void removeObjects(String bucketName, List keys) { + List objects = new LinkedList<>(); + keys.forEach(s -> { + objects.add(new DeleteObject(s)); + try { + removeObject(bucketName, s); + } catch (Exception e) { + System.err.println("批量删除失败!"); + } + }); + } + + + public String readObjectAsString(String bucketName, String objectName) throws Exception { try (InputStream inputStream = minioClient.getObject(