From 53a437397329645c1051a86731b93e8cdf26d72d Mon Sep 17 00:00:00 2001 From: Afly Date: Thu, 25 Jul 2024 17:05:56 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-128310=20fix:=20=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E8=AF=86=E5=88=AB=E5=8F=98=E6=88=90=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E9=85=8D=E7=BD=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin.xml | 3 +- .../fs/s3/repository/core/S3Config.java | 15 ++++++++++ .../repository/core/S3ResourceRepository.java | 30 +++++++++++++++---- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/plugin.xml b/plugin.xml index 4282763..ae68af3 100644 --- a/plugin.xml +++ b/plugin.xml @@ -5,12 +5,13 @@ com.fanruan.fs yes no - 1.4.4 + 1.4.5 11.0~11.0 2023-03-14 richie [2024-03-13]国际化更新
[2024-03-13]国际化更新
[2023-11-21]小文件不使用分片上传, 新增preserveMetadata后台配置。
diff --git a/src/main/java/com/fanruan/fs/s3/repository/core/S3Config.java b/src/main/java/com/fanruan/fs/s3/repository/core/S3Config.java index f54bd9e..ed27e16 100644 --- a/src/main/java/com/fanruan/fs/s3/repository/core/S3Config.java +++ b/src/main/java/com/fanruan/fs/s3/repository/core/S3Config.java @@ -44,6 +44,9 @@ public class S3Config extends CommonRepoConfig { @Identifier("preserveMetadata") private Conf preserveMetadata = HolderKit.simple(true); + @Identifier("openVirtualDirectory") + private Conf openVirtualDirectory = HolderKit.simple(false); + @GetConfig("endPoint") public String getEndPoint() { return endPoint.get(); @@ -124,6 +127,16 @@ public class S3Config extends CommonRepoConfig { this.preserveMetadata.set(preserveMetadata); } + @GetConfig("openVirtualDirectory") + public boolean isOpenVirtualDirectory() { + return openVirtualDirectory.get(); + } + + @SetConfig("openVirtualDirectory") + public void setOpenVirtualDirectory(boolean openVirtualDirectory) { + this.openVirtualDirectory.set(openVirtualDirectory); + } + @Override public void update(String key) { super.update(key); @@ -137,6 +150,7 @@ public class S3Config extends CommonRepoConfig { this.setSignerOverride(newConfig.getSignerOverride()); this.setMaxConnections(newConfig.getMaxConnections()); this.setPreserveMetadata(newConfig.isPreserveMetadata()); + this.setOpenVirtualDirectory(newConfig.isOpenVirtualDirectory()); } } @@ -151,6 +165,7 @@ public class S3Config extends CommonRepoConfig { cloned.signerOverride = (Conf) signerOverride.clone(); cloned.maxConnections = (Conf) maxConnections.clone(); cloned.preserveMetadata = (Conf) preserveMetadata.clone(); + cloned.openVirtualDirectory = (Conf) openVirtualDirectory.clone(); return cloned; } } diff --git a/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java b/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java index 6a25448..f8d05b3 100644 --- a/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java +++ b/src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java @@ -59,6 +59,9 @@ public class S3ResourceRepository extends BaseResourceRepository { private final boolean preserveMetadata; + // 是否将创建a/b/c.txt时的a/b/识别成一个存在的目录 + private final boolean openVirtualDirectory; + private final AmazonS3 s3; private final String bucket; @@ -86,6 +89,7 @@ public class S3ResourceRepository extends BaseResourceRepository { this.s3 = amazonS3ClientBuilder.build(); this.bucket = config.getBucket(); this.preserveMetadata = config.isPreserveMetadata(); + this.openVirtualDirectory = config.isOpenVirtualDirectory(); } @Override @@ -99,6 +103,7 @@ public class S3ResourceRepository extends BaseResourceRepository { ObjectMetadata metadata = s3.getObjectMetadata(bucket, path); return s3Object2FileEntry(metadata, path); } catch (Exception e) { + LogKit.error(e.getMessage(), e); LogKit.info("{} not exist!", path); } if (!path.endsWith(DELIMITER)) { @@ -330,7 +335,16 @@ public class S3ResourceRepository extends BaseResourceRepository { @Override public boolean exist(String path) { - return fileExist(path) || (!path.endsWith(DELIMITER) && dirExist(path)) || isParentPathAbsent(path); + if (fileExist(path)) { + return true; + } + if ((!path.endsWith(DELIMITER) && dirExist(path))) { + return true; + } + if (openVirtualDirectory) { + return isVirtualDirectory(path); + } + return false; } private boolean fileExist(String path) { @@ -352,9 +366,9 @@ public class S3ResourceRepository extends BaseResourceRepository { } /** - * 如果存在文件创建了,但是其父目录没有创建的场景,为其递归创建对象,返回创建结果 + * 是否将创建对象的前缀(比如a/b/c.txt时的a/b/)识别成一个存在的目录. */ - private boolean isParentPathAbsent(String path) { + private boolean isVirtualDirectory(String path) { if (path.startsWith(DELIMITER)) { path = path.substring(1); } @@ -364,7 +378,8 @@ public class S3ResourceRepository extends BaseResourceRepository { ObjectListing objectListing = s3.listObjects( new ListObjectsRequest() .withBucketName(bucket) - .withPrefix(path)); + .withPrefix(path) + .withDelimiter(DELIMITER)); for (S3ObjectSummary summary : objectListing.getObjectSummaries()) { if (summary.getKey().startsWith(path + DELIMITER)) { return createDirectory(path); @@ -416,7 +431,12 @@ public class S3ResourceRepository extends BaseResourceRepository { //是文件 return false; } else { - return dirExist(path) || isParentPathAbsent(path); + if (dirExist(path)) { + return true; + } else { + // 是一个虚拟的目录 + return openVirtualDirectory && isVirtualDirectory(path); + } } }