|
|
|
@@ -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<Result<Item>> results = minioClient.listObjects( |
|
|
|
@@ -103,7 +101,7 @@ public class MinioUtil { |
|
|
|
* @param recursive 是否递归查询 |
|
|
|
* @return MinioItem 列表 |
|
|
|
*/ |
|
|
|
public static List<Item> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) throws Exception { |
|
|
|
public List<Item> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) throws Exception { |
|
|
|
List<Item> list = new ArrayList<>(); |
|
|
|
Iterable<Result<Item>> 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<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder() |
|
|
|
.bucket(sourceBucketName) |
|
|
|
.prefix(sourceKeyPrefix) |
|
|
|
.recursive(true) |
|
|
|
.build()); |
|
|
|
|
|
|
|
for (Result<Item> 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<Map> listFilesInDirectory(String bucketName, String prefix) throws Exception { |
|
|
|
List<Map> 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<String> keys) { |
|
|
|
List<DeleteObject> 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( |
|
|
|
|